大話設計模式之裝飾模式

2021-06-12 13:39:31 字數 2481 閱讀 4151

概念:動態給乙個物件新增額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。

結構圖

解析:

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.類應設計...

大話設計模式之裝飾者模式

通過閱讀本篇文章,可以給喜歡使用繼承的開發人員提供一種新的思路。我們將會了解濫用繼承帶來的不良後果,同時也會介紹比繼承更合理的實現方式。利用繼承設計子類的行為,是在編譯時期靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充套件物件的行為,就可以在執行時動態地進行擴充套件...