裝飾者設計模式

2021-08-13 04:05:53 字數 2637 閱讀 8834

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

我們知道,咖啡店裡面的口味特別多,有dark roast(深烘焙),也有espresso(濃縮咖啡),也有machiatto(馬琪雅朵)等等。顧客點咖啡的時候也會順便點些配料,如牛奶(milk),摩卡(mocha),配料多達幾十種。對於這種場景,如果讓我們實現乙個訂單系統,每乙個訂單顯示顧客點了哪些東西和**,該如何實現呢?

用乙個咖啡基類beverage計算新增調料的總**,然後各個口味的咖啡類繼承該基本類,覆蓋cost()方法,並返回父類的調料**和該口味的**。

ublic class beverage 

if (hasmilk())

...}

public boolean hasmilk()

public boolean hasmocha()

....

}

當顧客點了darkrost咖啡時:

public

class

darkroast

extends

beverage

@override

public

double

cost()

...}

這樣的訂單系統,當調料和口味品種比較少時,是滿足需求的。但是當調料多時,父類beverage中判斷該訂單是否有某個調料的語句就越來越多,而且有些調料在某些口味中是不可能搭配的確被繼承到該口味中。更重要的是,當新增調料的時候,需要在父類新增該調料,這就違反了開發的對擴充套件開發,對修改封閉的原則。這時候裝飾模式就正好解決該問題。

當應用裝飾設計模式時,當顧客點了一杯darkroast,可直接計算出該物件的**。顧客覺得加點牛奶會更好喝,所以點了一些牛奶加在咖啡上,這時我們只需對darkroast物件粉飾一番,將這個物件加上milk生成新的粉飾物件,新的物件加上milk的**。最後顧客又點了摩卡,我們對這個新的粉飾物件再進行一番裝飾,加上摩卡的**。這樣,這個最終的物件是由darkroast不斷的被新增新的裝飾點形成的。顧客沒有要求soy調料,soy調料就不會作為裝飾點去粉飾darkroast物件。總體思路是需要什麼,就新增什麼,擴充套件什麼。乙個物件可以被多個物件進行粉飾包裝。用圖形象的表示如下:

為了實現這種效果,粉飾物件和被粉飾物件應該同屬乙個型別,即被粉飾物件darkroast和粉飾物件milk、mocha繼承同乙個類。粉飾物件可以獲取被粉飾物件的行為並新增上自己的行為。裝飾者設計模式總體設計框架如下圖所示:

按照這個框架圖,來實現我們的**。先建立乙個基類beverage,它是darkroast口味和調料milk、mocha共同繼承的物件。

public

abstract

class beverage

public

abstract

double

cost();

}

然後darkroast繼承beverage,它是具體被粉飾的物件。

public

class

darkroast

extends

beverage

@override

public

double

cost()

}

再建立粉飾物件共同的介面,這個介面也要繼承beverage,以實現粉飾物件和被粉飾物件同屬乙個型別。

public

abstract

class

codimentdecorator

extends

beverage

粉飾物件共有的介面有了之後,就可以實現具體的實現類了。

public

class

milk

extends

codimentdecorator

@override

public string getdescription()

@override

public

double

cost()

}public

class

mocha

extends

codimentdecorator

@override

public string getdescription()

@override

public

double

cost()

}

每乙個粉飾類都有乙個beverage物件,用來傳入被粉飾的物件,並對被粉飾的物件加上自己的行為。

最後我們來除錯一下:

public

class main

}

最終結果為:

most excellent dark roast 1.0

most excellent dark roast, milk 3.0

most excellent dark roast, milk , mocha 9.0

裝飾者設計模式

裝飾者模式 動態地給乙個物件新增一些額外的職責,就增加功能來說,decorator模式比生成子類更為靈活。讓decorator物件為自己新增功能。有時候使用concretecomponent的派生類提供核心功能,在這種情況就是用concretecomponent替代了component的功能,而且裝...

裝飾者設計模式

package 模式練習部分 首先建立,手機介面,然後建立最基本功能的手機,也就是只有接 功能的手機,然後在這個基礎上在設計乙個裝飾類 開始具體的裝飾過程,按照本例中的步驟,下面要做的就是對於具體裝飾者的建立,先有彩鈴,然後開始接 然後在接完 以後,沒有什麼其他的事情了,開始看會兒電視休息一下。建立...

裝飾者 設計模式

裝飾者 設計模式 1.增強乙個類的 功能,給某個類的 某個方法 增強了,重寫方法 2.讓裝飾類 互相裝飾 實現的步驟 1.在裝飾類的 內部 維護乙個 被裝飾類的 引用 最好是父類的引用 例如 bufferedline 內部維護的 是 bufferedreader類的引用 2.讓裝飾類 有乙個 共同的...