這個模式理解起來有些難度,本人也是通過看書、上網查資料,才了解了一些,下面來講解一些其中的道理吧!
定義:動態的將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
白話說:動態的擴充套件物件的功能
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 ...