设计模式(10)-装饰模式详解(易懂)
生活随笔
收集整理的這篇文章主要介紹了
设计模式(10)-装饰模式详解(易懂)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
裝飾模式的定義
裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
模型:
- Component:抽象組件,是一個接口或者抽象類;就是定義的最原始的對象
- ConcreteComponent:具體組件,實現類(需要裝飾)
- Decorator:裝飾角色,一般是抽象類,實現接口;它的屬性必然有個private變量指向Conponent抽象組件
- ConcreteDecorator:具體的裝飾對象
實例說明
舉個例子:比如一個正在上高中的學生“小明”在考完試后,和父母說想買一款5000元的手機。
1.Component,抽象方法-買手機
public abstract class AbstractBuyPhone {//主要是向父母提出想買手機的意向public abstract void BuyPhone();//父母是否同意public abstract void Agree(); }2.ConcreteComponent:具體的意向
public class XiaoMingBuyPhone extends AbstractBuyPhone {@Overridepublic void BuyPhone() {Log.d("qzs","我想買一款華為的5000元的手機");}@Overridepublic void Agree() {Log.d("qzs","父母同意了");} }3.Decorator,增加一個裝飾抽象類,方便修飾
public class AbstractDecorator extends AbstractBuyPhone {private AbstractBuyPhone abstractBuyPhone;public AbstractDecorator ( AbstractBuyPhone abstractBuyPhone){this.abstractBuyPhone=abstractBuyPhone;}@Overridepublic void BuyPhone() {this.abstractBuyPhone.BuyPhone();}@Overridepublic void Agree() {this.abstractBuyPhone.Agree();} }4.ConcreteDecorator:如果直接去找父母要手機,很容易被拒絕,所以需要修飾一下,這里用成績修飾一下
public class ScoreDecortator extends AbstractDecorator {public ScoreDecortator(AbstractBuyPhone abstractBuyPhone) {super(abstractBuyPhone);}//先和父母說說自己的成績private void ShowScore(){Log.d("qzs","我這次考試的成績年級前三,又進步了");}//重寫買手機的方法,先匯報成績,然后再提買手機的事情@Overridepublic void BuyPhone() {this.ShowScore();super.BuyPhone();} }5.調用,也就是請求父母:
AbstractBuyPhone str;//小明的原本意向str=new XiaoMingBuyPhone();//修飾后的意向str=new ScoreDecortator(str);//向父母提出想法(成績和買手機)str.BuyPhone();//父母同意了str.Agree();運行結果:
強調:這里只加了分數的修飾,可以加多個修飾類來滿足你最后的目的
裝飾模式的優缺點及其他
1.優點
- Decorator模式與繼承關系的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性。
- 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。
2.缺點
- 這種比繼承更加靈活機動的特性,也同時意味著更加多的復雜性。
- 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很復雜。
- 裝飾模式是針對抽象組件(Component)類型編程。但是,如果你要針對具體組件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行為,實現“半透明”的裝飾者模式。在實際項目中要做出最佳選擇。
3.適用場景
- 需要擴展一個類的功能,或給一個類添加附加職責。
- 需要動態的給一個對象添加功能,這些功能可以再動態的撤銷。
定義和優缺點來自網上百度信息
另外可以加入我的Android技術交流群:458739310
大家可以關注我的微信公眾號:「安卓干貨鋪」一個有質量、有態度的公眾號!
總結
以上是生活随笔為你收集整理的设计模式(10)-装饰模式详解(易懂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何提高还在用window系统的编码硬效
- 下一篇: JavaScript复制内容到剪贴板