設計模式 裝飾模式

2021-09-10 18:50:09 字數 2466 閱讀 2542

這個模式理解起來有些難度,本人也是通過看書、上網查資料,才了解了一些,下面來講解一些其中的道理吧!

定義:動態的將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。

白話說:動態的擴充套件物件的功能

uml圖如下:

角色扮演:

1、抽象構件(component):給出乙個抽象介面,以規範準備接收附加責任的物件

2、具體構件(concrete component):定義乙個將要接收附加責任的類

3、裝飾(decorator):持有乙個構件(component)物件的例項,並定義乙個與抽象構件介面一致的介面

4、具體裝飾(concrete decorator):負責給構件物件「貼上」附加的責任

有時候我們會發現有些情況我們抽象不出以上幾種角色,這個時候我們需要進行一些改動:

1、如果只有乙個concretecomponent類而沒有抽象的component類,那麼decorator類可以是concretecomponent的乙個子類。

2、如果只有乙個concretedecortor類,那麼就沒有必要建立乙個單獨的decorator類,而可以把decorator和concretedecorator的責任合併成乙個類

說了這麼多,我們也許還會有些矇圈,現在就讓我們用實在的例子去理解吧!

先看一下小菜穿衣服的例子

uml結構圖如下:

解說:這裡人相當於具體構件(concretecomponent),服飾相當於裝飾角色(decorator),下面那些衣服相當於具體的服飾,這個例子中沒有抽象構件!

**如下:

person類,相當於concretecomponent

class person

private string name;

public person(string name)

public virtual void show()

", name);}}

服裝類(decorator)

class finery : person

public override void show()}}

具體服飾類

class tshirts : finery

}class bigtrouser : finery

}class sneakers : finery

}class leathershoes : finery

}class tie : finery

}class suit : finery

}

客戶端**:

person xc = new person("小菜");

console.writeline("\n第一種裝扮:");

sneakers pqx = new sneakers();

bigtrouser kk = new bigtrouser();

tshirts dtx = new tshirts();

pqx.decorate(xc);

kk.decorate(pqx);

dtx.decorate(kk);

dtx.show();

console.writeline("\n第二種裝扮:");

leathershoes px = new leathershoes();

tie ld = new tie();

suit xz = new suit();

px.decorate(xc);

ld.decorate(px);

xz.decorate(ld);

xz.show();

console.readkey();

注意:person類、服裝類、具體服飾類之間的關係是繼承,客戶端的**直接呼叫他們

1、裝飾者和被裝飾物件具有相同的型別

2、可以用乙個或多個裝飾者包裝乙個物件

3、由於裝飾者和被裝飾物件有相同的型別,所以在任何需要原始物件的場合,都可以用裝飾過的物件代替他

4、裝飾者可以在所委託被裝飾著的行為之前或之後,加上自己的行為,以達到特定的目的

5、物件可以在任何時候被裝飾,所以可以在執行時動態的,不限量的用需要的裝飾者來裝飾物件

設計模式 裝飾模式

裝飾模式,動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。m 超級瑪麗 普通繼承模式實現 a 發鏢 能組合出七種功能 m1 a m4 a b b 變身 m2 b m5 a c c 無敵 m3 c m6 b c m7 a b m m1 a b 組合方法 new m2 m...

設計模式 裝飾模式

剛看了看設計模式,真是費了好多的腦細胞。想著想著就到了食堂。o o哈!正是長身體的時候 大神勿噴 一定要多吃點。於是我打了乙份公尺飯,然後又端著盛公尺飯的盤子買了乙份菜 看著還不是很夠,就又端著這個盤子買了一條最愛吃的魚。裝飾模式!五一要來了。回家轉轉,沒有小外甥的玩具怎麼行。於是我去超市,推著購物...

設計模式 裝飾模式

複習設計模式 裝飾模式 裝飾模式 在不修改已經存在的類的情況下,動態的新增新的功能,實現即插即用,開放關閉原則 public inte ce man public class batman implements man override public void killmonster public ...