裝飾著模式(Decorator Pattern)

2022-06-09 21:48:12 字數 2502 閱讀 3630

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

簡單的說,裝飾者模式由三部分組成,分別是基礎抽象類,可以被裝飾者包裝的類、裝飾者類,後兩種類均是基礎抽象類的子類,但是裡面的方法對於基礎類有更多的擴充套件,最終使用,均是使用的基礎類進行操作,因此,無論怎麼包裝,出來的物件都可以使用基礎類接收。同時,可以被裝飾者包裝的類一般使用無參構造,而裝飾者類則是使用基礎類作為入參的建構函式。

舉個例子,一杯咖啡,他的名字和售價,就可能因為新增不同的調料而導致售價和名稱不同,並且調料的組合方式也存在多種。

在jdk中,i/o就是使用的裝飾著模式,如下圖所示,inputstrem是裝飾者模式的抽象元件,紅色標記的4個是可以被裝飾者包起來的具體元件,而綠色部分,就是具體的裝飾者。

試用裝飾者模式有乙個缺點,就是**中會存在大量的小類,可能會給使用api人造成困擾。

那麼,就根據上述舉的例子,來寫一下裝飾者模式

首先,建立乙個抽象類,抽象類中包含乙個獲取名稱的方法和乙個獲取**的抽象方法

package lcl.mm.pattern.decorator;

public

abstract

class

beverage

public

abstract

intcost();

}

然後,分別建立兩個可以被裝飾者包裝的a咖啡類和b咖啡類,類中乙個無參建構函式和乙個獲取**的函式,無參建構函式中直接返回咖啡的名稱,而**直接返回自身的**。

package lcl.mm.pattern.decorator;

public

class

cofeea extends beverage

@override

public

intcost()

}

package lcl.mm.pattern.decorator;

public

class

cofeeb extends beverage

@override

public

intcost()

}

接下來就建立兩個裝飾者類調味料a和調味料b,類中包含有參建構函式、獲取名稱方法和獲取售價方法,在建構函式中,將beverage傳入,獲取名稱時,在原有beverage的名稱上加上該調味料的名稱,而獲取**的方法是在原有beverage的售價上加上該調味料的**、

package lcl.mm.pattern.decorator;

public

class

condimenta extends beverage

public

string getdesc()

@override

public

intcost()

}

package lcl.mm.pattern.decorator;

public

class

condimentb extends beverage

public

string getdesc()

@override

public

intcost()

}

如上,裝飾者模式就寫完了,接下來進行測試:

@test

public

void

decoretortest()售價:${}

",beverage1.getdesc(),beverage1.cost());

beverage beverage = new

cofeeb();

log.info(

"beverage=={}售價:${}

",beverage.getdesc(),beverage.cost());

beverage = new

condimenta(beverage);

log.info(

"beverage=={}售價:${}

",beverage.getdesc(),beverage.cost());

beverage = new

condimentb(beverage);

log.info(

"beverage=={}售價:${}

",beverage.getdesc(),beverage.cost());

beverage = new

condimenta(beverage);

log.info(

"beverage=={}售價:${}

",beverage.getdesc(),beverage.cost());

}

輸出:

裝飾著模式

package com.henu.decorator 漢堡基類 author rock public abstract class humburger public abstract double getprice package com.henu.decorator 雞腿堡類 被裝飾者的初始狀態,...

裝飾著模式

裝飾著模式 裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。案例 有這樣乙個專案,做乙個餐廳訂餐系統。起初的 結構是這樣的。前面有很多beverage的繼承類,現在遇到的問題是牛奶的價錢 了,那麼所有相關的類,我們都要進行調整,比如milk,sugaran...

設計模式 裝飾著模式

裝飾者模式的應用場景覆蓋,擴充套件,is a,前置,寫法 裝飾者模式 decorator pattern 是指在不改變原有物件的基礎之上,將功能附加到物件上,提供了比繼承更有彈性的替代方案 擴充套件原有物件的功能 裝飾者在 程式中適用於以下場景 1 用於擴充套件乙個類的功能或給乙個類新增附加職責。2...