裝飾者模式

2022-09-11 00:06:38 字數 2127 閱讀 8774

裝飾者模式:

動態地將責任附加到物件上, 若要擴充套件功能, 裝飾者提供了比繼承更有彈性地替代方案

關鍵:  裝飾者和被裝飾者都繼承同乙個物件,  裝飾者繼承並不是為了獲得父類地行為, 而是達到型別匹配地目的

通常裝飾者模式採用抽象類

j**a中的裝飾類: i/o

component--->inputstream

concretecomponent---->fileinputstream, stringbufferinputstream, bytearrayinputstream..

decorator----> filterinputstream;

concrete--->bufferedinputstream...是不是覺得一下子恍然大悟了, 之前一直用輸入流的時候套管道--.--;

example:  想象一下, 一家咖啡店, 咖啡裡面可以加各種不同地調料, 你要去計算每一種不同搭配的飲料的**, 怎麼辦

1. 簡單的繼承想法: 先建立乙個抽象的bevarage(飲料)基類, 把計算**的方法都定義成抽象的, 所有具體的咖啡都繼承這個父類, 然後實現自己的幾個計算

如果這麼做,我們來考慮幾個問題, 1) 首先調料之間就有非常多的組合, 難道你要每一種組合都去實現它的具體類嗎, 2) 就算你毅力驚人實現了所有類, 那麼要            **變了, 打折了, 新新增了一種調料, 難道又要重寫嗎, 顯然繼承有點難以為繼

所以我們想, 你的咖啡裡加了什麼調料, 我們可以動態地把**加上去多好

下面就是乙個簡單利用裝飾模式, 實現動態地計算咖啡**地例子:

1) 乙個抽象beverage基類, 含有乙個計算cost的抽象方法;

public

abstract

class

bevarage

abstract

double

cost();

}

2) 普通coffe類和抽象condiments類都繼承bevarage類, 同時裝飾者中含有乙個bevarage物件---->實現裝飾模式的關鍵;

public

class 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 ...