案例展示:
星巴克咖啡訂單專案(咖啡館):
咖啡種類/單品咖啡: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 ...