裝飾者模式:
動態地將責任附加到物件上, 若要擴充套件功能, 裝飾者提供了比繼承更有彈性地替代方案
關鍵: 裝飾者和被裝飾者都繼承同乙個物件, 裝飾者繼承並不是為了獲得父類地行為, 而是達到型別匹配地目的
通常裝飾者模式採用抽象類
j**a中的裝飾類: i/o
component--->inputstream
concretecomponent---->fileinputstream, stringbufferinputstream, bytearrayinputstream..
decorator----> filterinputstream;
concrete--->bufferedinputstream...是不是覺得一下子恍然大悟了, 之前一直用輸入流的時候套管道--.--;
example: 想象一下, 一家咖啡店, 咖啡裡面可以加各種不同地調料, 你要去計算每一種不同搭配的飲料的**, 怎麼辦
1. 簡單的繼承想法: 先建立乙個抽象的bevarage(飲料)基類, 把計算**的方法都定義成抽象的, 所有具體的咖啡都繼承這個父類, 然後實現自己的幾個計算
如果這麼做,我們來考慮幾個問題, 1) 首先調料之間就有非常多的組合, 難道你要每一種組合都去實現它的具體類嗎, 2) 就算你毅力驚人實現了所有類, 那麼要 **變了, 打折了, 新新增了一種調料, 難道又要重寫嗎, 顯然繼承有點難以為繼
所以我們想, 你的咖啡裡加了什麼調料, 我們可以動態地把**加上去多好
下面就是乙個簡單利用裝飾模式, 實現動態地計算咖啡**地例子:
1) 乙個抽象beverage基類, 含有乙個計算cost的抽象方法;
public2) 普通coffe類和抽象condiments類都繼承bevarage類, 同時裝飾者中含有乙個bevarage物件---->實現裝飾模式的關鍵;abstract
class
bevarage
abstract
double
cost();
}
publicclass coffe extends
bevarage
@override
double
cost()
}/*不知道這個beverage放在者還是子類裡比較好*/
public
abstract
class codimentsdecorator extends
bevarage
public
class milk extends
codimentsdecorator
public
string getdescription()
@override
double
cost()
}public
class mocha extends
codimentsdecorator
@override
public
string getdescription()
@override
double
cost()
}public
class
test
}輸出: normal coffe, milk, mocha
cost 6.8
裝飾者模式
裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...
裝飾者模式
裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...
裝飾者模式
裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...