裝飾者模式是指,在不改變原有物件的基礎上,將功能附加到物件上,提供了比繼承更有彈性的方案(擴充套件原有物件的功能),繼承相對來說,比較死板,不夠靈活。
我們以,煎餅為例子,+雞蛋,+火腿來進行demo演示,
核心類
public class battercake
public int getprice()
}
我們現在需要給業務進行擴充套件,現在可以+火腿腸,可以+雞蛋。
在煎餅的基礎上+雞蛋,**也要加。
public class battercakewithegg extends battercake
public int getprice()
}
我們+雞蛋之後,還想加火腿腸
public class battercakewitheggandsausage extends battercakewithegg
public int getprice()
}
業務被呼叫:測試
public static void main(string args)
結果:
我們完成了,煎餅業務的擴充套件,但是這裡存在問題,如果我們想要單獨+香腸,那麼還需要新增乙個類,如果我們需要加其他的,比如青菜,等等,然後他們的組合,那麼類的數量就會極具增長。
如果我們把業務換成奶茶,每乙個奶茶品種,需要大杯,小杯,增加新的活動等等,使用繼承,都會把類的數量提高很多。所以繼承在擴充套件業務方面,存在很大的弊端,我們來看裝飾者模式如何解決。
煎餅抽象類
public abstract class battercake
煎餅基礎業務實現:
public class basebatterckage extends battercake
@override
public int getprice()
}
煎餅裝飾者抽象類:
public abstract class battercakedecorator extends battercake
protected abstract void dosomething(); //抽象類的特點,抽象方法和實體方法共存
@override
protected string getmsg()
@override
public int getprice()
}
煎餅業務擴充套件:
public class eggdecorator extends battercakedecorator
@override
protected void dosomething()
protected string getmsg()
public int getprice()
}
public class sausagedecorator extends battercakedecorator
@override
protected void dosomething()
protected string getmsg()
public int getprice()
}
測試:
public static void main(string args)
結果:
可見,我們在原來的業務上,擴充套件的新功能,而且有靈活性,我們可以想加多少加多少。
裝飾者與**模式的區別:
1.**模式針對的符號條件的方法,它不是針對某個業務,而是針對**功能,它擴充套件的業務,是不改變原方法的結果的,而裝飾者模式,它針對的是某個業務,它擴充套件的內容是針對業務進行的,它能夠改變結果。
2.代模式開啟之後,你看不到原**的,只能使用**類,而裝飾者擴充套件之後,擴充套件內容是可選的,你可以使用,也可以使用原內容。
設計模式 裝飾者模式
public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...
設計模式 裝飾者模式
沒什麼特別的,之前看懂了,這次自己再複述一下。畢竟把別人講懂了才是真的懂了。主要參考了head first 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...
設計模式 裝飾者模式
好幾天沒出部落格了,在學習android的一些新控制項的時候,用到了乙個模式,叫裝飾者模式,所以在此講講這個模式。模式,包含以下四個角色 1 抽象構件 component 角色 給出乙個抽象介面,以規範準備接收附加責任的物件。2 具體構件 concretecomponent 角色 定義乙個將要接收附...