概念:動態給乙個物件新增額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
結構圖:
解析:
component類:
定義乙個物件介面,可以給這些物件動態新增職責(方法)。
concretecomponent類:
定義了乙個具體的物件,也可以給這個物件新增職責。
decorator類:
裝飾抽象類,繼承
component
,從外類來擴充套件
component
類的功能,但對於
component
來說,是無需知道
decorator
的存在的。
concretedecorator類:
具體的裝飾物件,起到給
component
新增職責的功能。
注意:
如果只有乙個
concretecomponent
類而沒有抽象的
component
類,那麼
decorator
類可是concretecomponent
的乙個子類,同樣道理,如果只有乙個
concretedecorator
類,那麼就沒有必要建立乙個單獨的
decorator
類,而可以把
decorator
和concretedecorator
的責任合併成乙個類。
先看結構乙個結構圖:
此時,沒有component類,將「人「這個類看成是component類和concretecomponent類的綜合體,那麼」服飾類「(decorator類)可以看成是其乙個子類,後面的球鞋類、西裝類、領帶類、皮鞋類都是具體的裝飾物件。
例項:
結構圖:
**實現:
photot life = new lifephoto();
photot art= new artphoto ();
();();
photoframe glass=new glassphotoframe (life );
glass .display ();
photoframe ruby = new rubyphotoframe(art );
ruby.display ();}}
//物件介面
abstract class photot
//具體物件
class lifephoto : photot //具體物件一
}class artphoto : photot //具體物件二
}//裝飾抽象類
abstract class photoframe : photot
public override void display()
}//具體裝飾物件
class glassphotoframe : photoframe //裝飾物件一
public override void display()
}class rubyphotoframe : photoframe //裝飾物件二
public override void display()
}
執行結果:
優點:
第一:使書寫的**具有柔韌性,能夠以一系列的功能來增加代替物件的行為,它不會汙染原有的**,反而會讓**容易編寫,容易對外擴充套件。
第二:它將每個功能放在乙個單獨的類中,讓這個類去包裝要裝飾的物件,這樣就將裝飾功能類與原有的類分開,簡化了原有類,類的核心職責和裝飾功能也區分開了,而且相關類中重複的裝飾邏輯也沒有了。
缺點:
第一:如果原有的物件的介面發生變化了,那麼他所有的裝飾類也得修改,進而匹配介面。
第二:如果裝飾鏈過大,系統就會花費較長的時間去用於初始化物件,影響資訊的傳遞。
適用範圍:
第一:想在不影響其他類的情況下,動態的給物件新增新的職責方法;
第二:給物件增加職責可能會在未來發生改變;
第三:用子類來擴充套件功能不方便的情況下。
大話設計模式之裝飾模式
定義 分離類的職責,讓裝飾和主類分離,好處 利用setcomponent來物件進行包裝,這樣每個裝飾物件的實現就和如何使用這個物件分離開了,每個裝飾物件只關心自己的功能,不需要關心被如何新增到物件鏈中 有效的把類的核心職責和裝飾功能分開了,而且可以去除相關類中複雜的裝飾邏輯。例子 服飾類繼承人類,先...
大話設計之裝飾模式
裝飾模式 動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。設計原則 1.多用組合,少用繼承 利用繼承設計子類的行為,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充套件物件的行為,就可以在執行時動態地進行擴充套件。2.類應設計...
大話設計模式之裝飾者模式
通過閱讀本篇文章,可以給喜歡使用繼承的開發人員提供一種新的思路。我們將會了解濫用繼承帶來的不良後果,同時也會介紹比繼承更合理的實現方式。利用繼承設計子類的行為,是在編譯時期靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充套件物件的行為,就可以在執行時動態地進行擴充套件...