咖啡訂單需求
1、咖啡種類/單品咖啡:decaf(無因咖啡) longblack(美式咖啡)等等。
2、可新增調料:milk、chocolate 等等。
3、要求在擴充套件新的咖啡種類或者調料時,具有良好的擴充套件性、可維護性。
4、使用物件導向的方式來計算不同種類咖啡的費用,客戶可以點單品咖啡、也可以任意新增調料。
解決方案 如果組合出每種類可能型別的咖啡太過龐大 自己的思路
自己的思路->有咖啡抽象類 和 調料抽象類,具體類繼承他們,order類計算費用,即便是增加其它種類的咖啡、調料、擴充套件即可。但是我仔細分析發現還是有點問題的,咖啡可以只點單品,也可以新增多份調料,或者一次點多杯咖啡,每種咖啡不同的調料,這樣類的改動很大,可維護性較差。這個思路不太好。
基本介紹
裝飾者模式:動態的將新功能附加到物件上。在物件功能擴充套件方面,它比繼承更有彈性,裝飾者模式也體現了開閉原則(ocp)
原理簡介
舉個栗子:乙個遊戲人物,給它加頭飾、**、佩戴品等等將這個人物裝飾起來,那麼就需要有乙個主體比如 人物,包裝品 比如頭飾等等。也就是動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案,結合裝飾者模式的類圖
類圖中的角色簡要說明:
1、component :抽象構件,它是乙個介面或者類,是定義的最核心物件,也就是最原始的物件,比如上文中的遊戲人物。
2、concretecomponent :具體構件也叫做基礎構件。是component的實現,可以單獨用。也可以進行裝飾。
3、decorator 裝飾角色,一般是乙個抽象類,也是component的實現,但是在它的屬性中有乙個變數指向 component抽象構件。decorator持有component這個變數,可以看作是反向操作,是裝飾角色持有了具體的構件。比如說,上面的例子中給遊戲人物新增配飾,不是將配飾給了人物,而是在配飾上新增了個人物。
4、concretedecorator 具體裝飾角色,把基礎構件裝飾成新的構件。
使用裝飾者模式的設計方案
簡要說明 drink類就是抽象類component。
decaf 就是單品咖啡。
decorator 就是裝飾類,包含乙個被裝飾的物件。
裝飾者模式下的咖啡 2份巧克力+1份牛奶的decaf咖啡
簡要說明:milk包含了decaf 、乙份chocolate 包含了milk+decaf、乙份chocolate包含了chocolate+milk+decaf。這樣不管是什麼形式的咖啡都可以通過遞迴的方式進行計算,方便組合和維護。
**實現
package com.example.pattern.decorator;
import lombok.getter;
import lombok.setter;
/** * 裝飾者模式
*/@getter
@setter
public
abstract
class
drink
class
coffee
extends
drink
}class
decaf
extends
coffee
}class
longblack
extends
coffee
}abstract
class
decorator
extends
drink
@override
public integer cost()
@override
public string getdes()
}// 這裡就是調味品
class
chocolate
extends
decorator
}class
milk
extends
decorator
}class
client
}
裝飾者在jdk原始碼的分析
第八節 函式
函式的特性 減少 重複 使程式變得可擴充套件 使程式變得易維護 乙個函式只做一件事情 變數作用域 python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在 賦值的。變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱。python的作用域一共有4種,分別是 以 l...
編譯原理 第八節
分為兩大類 自頂向下分析 和 自底向上分析 其中前者又細分為 遞迴下降分析法 包含回溯的遞迴下降分析法和不含回溯的遞迴下降分析法 和非遞迴的 分析法 ll分析法 後者分為算符優先分析法和lr分析法。思想 從語法的開始符號出發,試探使用不同產生式,尋找匹配於輸入符號串的推導。或者說,從對應文法開始符號...
學習JS第八節 陣列
1.三目運算子var num 判斷條件 返回式一 返回式二 2.陣列定義方法var arr 10 10 陣列長度就是113.push 在陣列最後一位新增 實現 var arr 1,2,3 array.prototype.push function return this.length 4.pop 彈...