設計模式之裝飾者模式

2021-10-02 17:14:12 字數 4262 閱讀 9055

案例展示:

星巴克咖啡訂單專案(咖啡館):

咖啡種類/單品咖啡:espresso(義大利濃咖啡)、shortblack、longblack(美式

咖啡)、decaf(無因咖啡)

調料:milk、soy(豆漿)、chocolate

要求在擴充套件新的咖啡種類時,具有良好的擴充套件性、改動方便、維護方便

使用oo的來計算不同種類咖啡的費用: 客戶可以點單品咖啡,也可以單品咖

啡+調料組合。

方案1-解決星巴克咖啡訂單專案

方案1-解決星巴克咖啡訂單問題分析:

drink 是乙個抽象類,表示飲料

des就是對咖啡的描述, 比如咖啡的名字

cost() 方法就是計算費用,drink 類中做成乙個抽象方法.

decaf 就是單品咖啡, 繼承drink, 並實現cost

espress && milk 就是單品咖啡+調料, 這個組合很多

問題:這樣設計,會有很多類,當我們增加乙個單品咖啡,或者乙個新的調料,

類的數量就會倍增,就會出現類**

裝飾者模式定義

裝飾者模式:動態的將新功能附加到物件上。在物件功能擴充套件方面,它比繼承更

有彈性,裝飾者模式也體現了開閉原則(ocp)

這裡提到的動態的將新功能附加到物件和ocp原則,在後面的應用例項上會以代

碼的形式體現

裝飾者模式原理:

裝飾者模式就像打包乙個快遞

主體:比如:陶瓷、衣服 (component) // 被裝飾者

包裝:比如:報紙填充、塑料泡沫、紙板、木板(decorator)

component

主體:比如類似前面的drink

concretecomponent和decorator

concretecomponent:具體的主體,

比如前面的各個單品咖啡

decorator: 裝飾者,比如各調料.

在如圖的component與concretecomponent之間,如果

concretecomponent類很多,還可以設計乙個緩衝層,將共有的部分提取出來,

抽象層乙個類。

用裝飾者模式設計的方案:

**實現:

drink類--抽象類

/**

* @author 孫一鳴 on 2020/2/10

*/public

abstract

class

drink

public

void

setdes

(string des)

public

float

getprice()

public

void

setprice

(float price)

//計算費用的抽象方法

//子類來實現

public

abstract

float

cost()

;}

緩衝層:

/**

* 緩衝層

* * @author 孫一鳴 on 2020/2/10

*/public

class

coffee

extends

drink

}

這個緩衝類使用了super關鍵字

解析super關鍵字:

一.super關鍵字作用

1:主要存在於子類方法中,用於指向子類物件中父類物件。

2:訪問父類的屬性

3:訪問父類的函式

4:訪問父類的建構函式

二.super注意的地方

super指向的是當前呼叫物件的父類。類載入完畢,建立物件,父類的構造方法會被呼叫(預設自動無參),然後執行子類相應構造建立了乙個子類物件,該子類物件還包含了乙個父類物件。該父類物件在子類物件內部。this super只能在有物件的前提下使用,不能在靜態上下文使用。

三.super關鍵字的使用

1.子類的建構函式預設第一行會預設呼叫父類無參的建構函式,隱式語句

三種咖啡全是抽象類drink的子類

義大利咖啡:

/**

* @author 孫一鳴 on 2020/2/10

*/public

class

espresso

extends

coffee

}

美式咖啡:

/**

* @author 孫一鳴 on 2020/2/10

*/public

class

longblack

extends

coffee

}

short咖啡:

/**

* @author 孫一鳴 on 2020/2/10

*/public

class

shortblack

extends

coffee

}

decorator 是乙個裝飾類,含有乙個被裝飾的物件(drink obj)

/**

* @author 孫一鳴 on 2020/2/10

*/public

class

decorator

extends

drink

@override

public

float

cost()

@override

public string getdes()

}

@override

public string getdes()

}裝飾類:牛奶:

/**

* @author 孫一鳴 on 2020/2/10

*/public

class

milk

extends

decorator

}

裝飾類:豆漿:

/**

* @author 孫一鳴 on 2020/2/10

*/public

class

soyextends

decorator

}

呼叫:

/**

* @author 孫一鳴 on 2020/2/10

*/public

class

coffeebar

}

演示截圖:

裝飾者模式在jdk應用的原始碼分析:

public abstract class inputstream implements closeable{} //是乙個抽象類,即component

public class filterinputstream extends inputstream

class datainputstream extends filterinputstream implements datainput { //filterinputstream 子類,

設計模式之 裝飾者模式

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

設計模式之裝飾者模式

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

設計模式之裝飾者模式

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