裝飾者模式的核心就是 裝飾者 和 被裝飾者 必須是共同的型別,可以是實現共同的介面,或者擁有共同的祖先。
最複雜的應該是這種情況:(多個裝飾者和多個被裝飾者)(baseclass 和 decorator 都是抽象類,)
看到上圖,可能有些人就要問了,decoratorx 和 decoratory 能不能直接繼承 baseclass 呢?
在裝飾者數量不多的話這樣也是可以的,但是比較這兩個圖,你會發現第乙個圖結構層次更鮮明,而且更方便管理裝飾者。
如果被裝飾者只有乙個的話,而且裝飾者不多的情況下你甚至可以這樣:
接下來看個簡單的例子吧:(第二個圖)
packagealgorithm.demo;
public
abstract
class
chicken
public
void
setname(string name)
}
packagealgorithm.demo;
public
class hen extends
chicken
}
packagealgorithm.demo;
public
class decoratorx extends
chicken
@override
public
void
lay_eggs()
public
void
sing_a_song()
}
packagealgorithm.demo;
public
class decoratory extends
chicken
@override
public
void
lay_eggs()
public
void
sing_a_song()
}
package結果如下圖所示:algorithm.demo;
public
class
main
}
通過裝飾者模式,我們實現了讓母雞在下蛋前後有了唱歌的行為,擴充套件了 lay_eggs 的方法。
看到上面的**你可能看到裝飾者的侷限性,擴充套件的行為只能是 baseclass 裡面有的,換句話說,就是只能擴充套件已有的方法。
那能不能給 baseclass 新增新的方法呢?答案是可以的,不過你得保證新增新的方法的裝飾者必須得在最外層。
packagealgorithm.demo;
public
class decoratorz extends
chicken
@override
public
void
lay_eggs()
public
void
fly()
}
decoratorz fly_chicken = new那麼如果 baseclass 是乙個介面的話呢,若是這樣的話,decorator 就是 baseclass,就像上圖圖二一樣。decoratorz(chicken);
fly_chicken.fly();
以上純屬個人見解,如有同感,皆大歡喜!若有謬論,還請指正!
裝飾者模式
裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...
裝飾者模式
裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...
裝飾者模式
裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...