設計模式學習第八節 裝飾者模式

2021-10-12 14:35:48 字數 2367 閱讀 4186

咖啡訂單需求

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 彈...