public class TestFruit {
為三山等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及三山網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站建設(shè)、三山網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
public static void main(String[] args) {
Fruit fruit;
fruit = Gardener.NewFruit("apple");
fruit.grow();
fruit.Flowering();
fruit.Fruiting();
fruit = Gardener.NewFruit("pear");
fruit.grow();
fruit.Flowering();
fruit.Fruiting();
}
}
interface Fruit {
void grow();
void Flowering();
void Fruiting();
}
class Apple implements Fruit {
public void Flowering() {
System.out.println("開花的是蘋果");
}
public void Fruiting() {
System.out.println("結(jié)果的是蘋果");
}
public void grow() {
System.out.println("種植的是蘋果");
}
}
class Pear implements Fruit {
public void Flowering() {
System.out.println("開花的是梨");
}
public void Fruiting() {
System.out.println("結(jié)果的是梨");
}
public void grow() {
System.out.println("種植的是梨");
}
}
final class Gardener {
public static Fruit NewFruit(String fruitname) {
if (fruitname.equals("apple")) {
return new Apple();
} else if (fruitname.equals("pear")) {
return new Pear();
}
return null;
}
}
不知這樣寫是否正確。個人認(rèn)為這應(yīng)該是一個工廠模式吧。
所有類的實現(xiàn)都由工廠類(也就是園丁類)完成。
寫的只是一個簡單工廠模式。
通過抽象類及接口,規(guī)定了具體類的特征作為抽象層,相對穩(wěn)定,不需更改,從而滿足“對修改關(guān)閉”;而從抽象類導(dǎo)出的具體類可以改變系統(tǒng)的行為,從而滿足“對擴展開放”。開閉原則在問題描述時就已經(jīng)實現(xiàn)了。當(dāng)然這只是對于客戶端(也就是測試類)來說,測試類只需要提供要創(chuàng)建對象的描述,系統(tǒng)自動創(chuàng)建相應(yīng)的對象。而對于工廠類并沒有滿足開閉原則。
開閉原則即封閉對原來代碼的修改,開放對原來代碼的擴展(如類的繼承,接口的實現(xiàn)等)
開閉原則是一種設(shè)計思想,并不局限于java語言
大概意思就是這些,但是要真正掌握運用開閉原則,還是要多多實踐,多多體會
設(shè)計模式里對這類設(shè)計有很詳細(xì)的說明,看一下挺好。
你這個例子也很典型,對理解接口來說,挺不錯的一個例子
//接口,在這里用接口是很恰當(dāng)?shù)?,因為任何水果都有計算各自的總價格的行為,這個行為分離出來,最好的方法就是做成接口
public interface IAccount {
public int getAccount();//get one fruit price
}
//水果類,因為任何一種水果的價格計算都是質(zhì)量乘以單價,所以計算總價值的方法可以直接在水果類中實現(xiàn),但是由于它只是個抽象類,真正執(zhí)行的時候,是計算了具體某種水果的單價乘以質(zhì)量。//這樣就省去了在每個派生出來的水果類里實現(xiàn)計算價值的方法。
public abstract class Fruit implements IAccount{
protected int weight;
protected int price;
public int getAccount() {
return this.price*this.weight;
}
}
//具體的水果類,水果類的派生類
//蘋果類
public class Apple extends Fruit{
public Apple(int w) {
this.price = 2;//因為每種水果不同,所以不必要在new它的時候再傳給它,直接在類里賦值即可,至于好的設(shè)計是完成相應(yīng)的get和set方法,這個再擴展。
this.weight = w;
}
}
//桔子類
public class Orange extends Fruit{
public Orange(int w) {
this.price = 3;//桔子的價格就不同于蘋果的了
this.weight = w;
}
}
//交易類
public class Bussiness {
/**
* @param args
*/
public static void main(String[] args) {
Fruit apple = new Apple(10);
Fruit orange = new Orange(15);
int allMoney = apple.getAccount() + orange.getAccount();
System.out.println(allMoney);
}
}
這樣,水果類就可以很方便的派生,只需聲明一個類繼承水果類(一定要是個抽象類),然后給price賦值,就可以在交易類里實例化并計算總價值,而不需要改動水果類里的任何代碼。
文章題目:開閉原則java代碼演示 Java開閉原則
當(dāng)前路徑:http://muchs.cn/article12/docdidc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、品牌網(wǎng)站建設(shè)、軟件開發(fā)、App設(shè)計、網(wǎng)站建設(shè)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)