裝飾者模式

2022-03-23 23:49:18 字數 2082 閱讀 3723

裝飾者模式的核心就是 裝飾者 和 被裝飾者 必須是共同的型別,可以是實現共同的介面,或者擁有共同的祖先。

最複雜的應該是這種情況:(多個裝飾者和多個被裝飾者)(baseclass 和 decorator 都是抽象類,)

看到上圖,可能有些人就要問了,decoratorx 和 decoratory 能不能直接繼承 baseclass 呢?

在裝飾者數量不多的話這樣也是可以的,但是比較這兩個圖,你會發現第乙個圖結構層次更鮮明,而且更方便管理裝飾者。

如果被裝飾者只有乙個的話,而且裝飾者不多的情況下你甚至可以這樣:

接下來看個簡單的例子吧:(第二個圖)

package

algorithm.demo;

public

abstract

class

chicken

public

void

setname(string name)

}

package

algorithm.demo;

public

class hen extends

chicken

}

package

algorithm.demo;

public

class decoratorx extends

chicken

@override

public

void

lay_eggs()

public

void

sing_a_song()

}

package

algorithm.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 新增新的方法呢?答案是可以的,不過你得保證新增新的方法的裝飾者必須得在最外層。

package

algorithm.demo;

public

class decoratorz extends

chicken

@override

public

void

lay_eggs()

public

void

fly()

}

decoratorz fly_chicken = new

decoratorz(chicken);

fly_chicken.fly();

那麼如果 baseclass 是乙個介面的話呢,若是這樣的話,decorator 就是 baseclass,就像上圖圖二一樣。

以上純屬個人見解,如有同感,皆大歡喜!若有謬論,還請指正!

裝飾者模式

裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...

裝飾者模式

裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...

裝飾者模式

裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...