裝飾者模式 結構型模式

2021-10-05 17:11:49 字數 2480 閱讀 9975

文章優先發表在個人部落格:

我們現在有乙個賣咖啡的需求。我們有咖啡,我們也有配料(巧克力、牛奶…)。現在我們要設計乙個程式計算使用者這杯咖啡的**。(咖啡 + 配料)

我們把每種組合都列舉出來。比如:咖啡+巧克力咖啡+雙份巧克力咖啡+牛奶

這樣的確很簡單的就達到了我們的需求但是有乙個問題就是產生很多的類,當我們新增了一種配料的時候又會新增很多種組合,維護性差。

我們在每種咖啡裡面定義每個配料的屬性,比如我們有乙個類:咖啡,在裡面把每種配料都作為屬性存放進去

public

class

coffee

通過上面的例子我們可以看到每次計算**的時候我們需要判斷對應的配料數是否大於0。

上面這種思路的確可以解決類很多的問題,但是我們新增一種配料的時候還是需要去修改之前的類,這不符合設計的ocp原則。

裝飾者模式:動態的將新功能附加到物件上。在物件功能擴充套件方面,它比繼承更有彈性,裝飾者模式也體現了開閉原則(ocp)

當我們需要乙個咖啡的時候:

當我們需要乙個咖啡 + 牛奶的時候:

當我們需要乙個咖啡 + 牛奶 + 巧克力的時候:

可能這樣並不是那麼好理解,下面寫**。當你看完**再來看上面的圖和**就好理解了。

drink

@data

public

abstract

class

drink

coffee

public

class

coffee

extends

drink

@override

public

float

cost()

@override

public string getdesc()

}

decorator

public

class

decorator

extends

drink

@override

public

float

cost()

@override

public string getdesc()

}

milk

public

class

milk

extends

decorator

}

chocolates

public

class

chocolates

extends

decorator

}

測試 (咖啡 + 牛奶 + 巧克力 + 牛奶)

public

class

main

}

1、每個咖啡裡面都是單獨的,它的cost()就是返回當前自己的**,它的getdesc()方法就是返回自己名字和單價。

2、每乙個裝飾者,裡面都包含乙個drink,它的cost()返回自己的** + drink的**,它的getdesc()方法就是返回自己名字和單價 + drink名字和單價。(這個drink是父類,所以它可以代表咖啡、也可以代表配料)

按照上面的分析,我們不管要套多少層都沒得關係,反正是乙個遞迴的方式輸出嘛。

思考一下:假如我們的這個咖啡下面還有子類,比如美式咖啡、拿鐵咖啡?那麼應該怎麼擴充套件呢?

我們只需要讓美式咖啡、拿鐵咖啡繼承咖啡就好了。然後 new 的時候我們不 new 咖啡,new 美式咖啡、拿鐵咖啡就好了。

結構型模式 裝飾者模式

動態地給乙個物件新增一些額外的職責。就增加功能來說,decorator模式相比生成子類更為靈活。1.在不影響其他物件的情況下,以動態 透明的方式給單個物件新增職責。2.處理那些可以撤消的職責。3.當不能採用生成子類的方法進行擴充時。1.component 定義乙個物件介面,可以給這些物件動態地新增職...

結構型模式 裝飾者模式

總結解決乙個問題 裝飾者模式 program ade someproblem author cade franklin create 2019 12 28 28 19 public abstract class drink string getdesc abstract float cost 接下來...

結構型模式 裝飾者設計模式

裝飾模式指的是在不必改變原類檔案和繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件,比如處理流。應用場景 需要擴充套件乙個類的功能,或給乙個類新增附加職責。優點就是耦合性低,重用性高 高內聚,低耦合 按照一般的方法,要麼就是分別修改各自的read方法,...