意圖:
裝飾模式可在不改變?cè)袑?duì)象的行為下棉饶,擴(kuò)展其行為垦页;
提供了比繼承更有彈性的替代方案紊册;
動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé);
別名:包裝器(Wrapper)模式
來自Head First
- 裝飾者和被裝飾對(duì)象有相同的類型男翰,這樣客戶端對(duì)象就可以用和真實(shí)對(duì)象相同的方式和裝飾對(duì)象交互另患;
- 可用一個(gè)或多個(gè)裝飾者包裝一個(gè)對(duì)象;
- 在任何需要原始對(duì)象(被包裝)的場(chǎng)合蛾绎,可用裝飾過的對(duì)象代替它(擴(kuò)展原始對(duì)象的行為)昆箕;
- 裝飾者可在所委托被裝飾者的行為之前或之后,加上裝飾后的行為租冠,以達(dá)到目的鹏倘;
- 對(duì)象可在任何時(shí)候,被裝飾顽爹,所以可以在運(yùn)行時(shí)動(dòng)態(tài)地纤泵、不限量的裝飾者來裝飾對(duì)象;
6.裝飾對(duì)象包含一個(gè)真實(shí)對(duì)象的引用镜粤;
示例類圖:
也可以將 被包裝的類捏题,放入 Decorator基類中,并設(shè)置成 protected類型的變量肉渴,這樣做公荧,其實(shí)更好,子類黄虱,就不需要維護(hù) wrapped 對(duì)象了;
裝飾者模式中的角色
- 被裝飾者抽象(Component):是一個(gè)抽象接口庸诱,或抽象類捻浦,也是該模式中的最元素的對(duì)象了;
- 被裝飾者具體實(shí)現(xiàn)(ConcreteComponent)桥爽,也是上圖中的ComponentA朱灿;
要裝飾的就是這個(gè)具體的實(shí)現(xiàn)類,可以有多個(gè)钠四,具體實(shí)現(xiàn)類盗扒,如: java io 體系; - 裝飾者基類(Decorator)可以是一個(gè)抽象類缀去,或者類侣灶,用來實(shí)現(xiàn)被裝飾者抽象(Component)中的方法,實(shí)現(xiàn)是通過 Componet 對(duì)象的引用來實(shí)現(xiàn)的缕碎;
- 裝飾者實(shí)現(xiàn)褥影,如上圖中的(DecoratorA 與 DecoratorB)是具體的裝飾者類,用來裝飾最基本的類咏雌,如:ComponentA;