設計模式之裝飾者模式

2021-09-29 08:31:20 字數 2724 閱讀 9160

​ 裝飾模式是在不使用繼承和不改變原類檔案的情況下,動態的擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。

注意其中三點:

1,不改變原類檔案。

2,不使用繼承。

3,動態擴充套件。

裝飾者模式與繼承關係的目的都是要擴充套件物件的功能,但是裝飾者可以提供比繼承更多的靈活性。

通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。

component(抽象元件又叫被裝飾物件的基類)

​ 定義乙個物件介面,可以給這些物件動態地新增職責。

concretecomponent(具體元件又叫具體被裝飾物件)

​ 定義乙個物件,可以給這個物件新增一些職責。

decorator(裝飾者抽象類)

​ 維持乙個指向component例項的引用,並定義乙個與component介面一致的介面。

concretedecorator(具體裝飾者)

​ 具體的裝飾物件,給內部持有的具體被裝飾物件,增加具體的職責。

如對一杯咖啡進行加料,有奶、糖、巧克力等,咖啡也分不同品種卡布奇諾、摩卡等

結構就看類圖

drink是最終成品,包含了裝飾的類和被裝飾類,再往下細分不同被裝飾的類和細節裝飾的類。

我們先分析出最終產品是顧客拿到的成品,成品類要有**屬性和描述加料的方法。

再往下分裝飾類和被被裝飾類,關鍵就是如何保證成品類的原有屬性加上裝飾類裝飾。

裝飾過程就是類似乙個遞迴的過程。

在最開始的時候,物件是drink子類coffee的子類

drink bm =

newmocha()

;

接著開始裝飾後變為drink子類decoratord的子類

bm =

newmilk

(bm)

;

在milk類中可以用構造方法預設修飾,也可以呼叫其方法修飾。引數bm已經存於decorator類的drink屬性中了,再次呼叫時

bm =

newmilk

(bm)

;

這個bm就不是最開始的blue_mountain類物件了,而是decorator子類milk類的物件了,由於裝飾類coffee和被裝飾類decorator都是drink子類,所以引數沒有問題。

在展示時

system.out.

println

(bm.

getdes()

+" "

+bm.

cost()

);

這個bm第一次呼叫getdes()方法是將本次裝飾元素「牛奶」輸出,並呼叫父類的drink屬性物件的getdes()方法,由於這個屬性也是milk類的物件所以就產生了類似遞迴的情況,由上文可知第二getdes()方法內的drink屬性不再是milk物件了,而是最開始的blue_mountain類物件,在這個getdes()中不再呼叫getdes()方法於是就結束了遞迴。

getdes()方法

public string getdes()

結果

牛奶 4.0

&&牛奶 4.0

&&摩卡咖啡 15.0

牛奶 4.0(第一次getdes(),此時的this.drink物件是milk類的)&&牛奶 4.0(第二次getdes(),此時的this.drink物件是mocha類的)&&摩卡咖啡 15.0

public

abstract

class

drink

public string getdes()

public

void

setdes

(string des)

public

double

getprice()

public

void

setprice

(double price)

public

double

cost()

}

public

class

coffee

extends

drink

}

public

class

decorator

extends

drink

public

double

cost()

public string getdes

(}

public

class

milk

extends

decorator

}

public

class

mocha

extends

coffee

}

設計模式之 裝飾者模式

一 裝飾者模式 裝飾者模式又稱為包裝模式。動態地給乙個物件增加新的職責。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式顧名思義就是對乙個物件進行裝飾,具體怎樣裝飾呢?那就是給這個物件不斷的增加職責方法。給乙個物件增加方法不簡單啊,用繼承或者直接在物件的類中增加方法。如果我們要對自...

設計模式之裝飾者模式

此模式動態將職責附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更具彈性的代替方案,以一圖一概括。要點1 裝飾者和被裝飾物件有相同的超型別。2 可以用乙個或多個裝飾者包裝乙個物件。3 裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。4 物件可以在任何時候被裝飾,所以可...

設計模式之裝飾者模式

public abstract class beverage 返回當前飲品的 public abstract double cost 為了讓condiment decorator 調料裝飾者 能夠取代beverage,所以將它擴充套件至beverage類 public abstract class ...