設計模式學習(三)之裝飾者模式

2021-08-10 05:57:09 字數 2754 閱讀 8671

設計原則:類應該對擴充套件開放,對修改關閉

我們的目標是允許類容易擴充套件,在不修改**的情況下,就可以搭配新的行為,如能實現這樣的目標,這樣的設計具有彈性,可以應對改變,可以接受新的功能來應對改變的需求

裝飾者和被裝飾者物件有相同的超型別

可以用乙個或者多個裝飾者包裝乙個物件

既然裝飾者和被裝飾者有相同的超型別,所以在任何需要原始物件的場合,可以用裝飾過的物件代替它

裝飾者模式:動態的將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案

裝飾者類圖

看個具體問題:

有乙個咖啡店,他們有幾種飲料,比如houseblend, darkroast.decaf,espresso

每種飲料裡面可以加調料,可以加一種或者幾種,也可以不加,調料有,steamedmilk.soy,mocha等

計算一杯飲料的**,包括飲料的**和調料的**

看一下類圖

那麼問題來了

如果需要新增新的調料,需要加上新的方法

如果**修改了,需要修改父類的**

有些飲料並不適合某些調料,仍然加入了判斷

如果需要加入雙倍的某種調料呢?

看新的類圖

用**來實現 

package com.alvin.decorator;

public abstract class beverage

package com.alvin.decorator;

public class houseblend extends beverage

@override

public string getdescription()

}

package com.alvin.decorator;

public class decaf extends beverage

@override

public float cost()

}

package com.alvin.decorator;

public class darkroast extends beverage

@override

public float cost()

}

package com.alvin.decorator.impl;

import com.alvin.decorator.beverage;

public abstract class condimentdecorator extends beverage

package com.alvin.decorator.impl;

import com.alvin.decorator.beverage;

public class milk extends condimentdecorator

@override

public string getdescription()

@override

public float cost()

}

package com.alvin.decorator.impl;

import com.alvin.decorator.beverage;

public class mocha extends condimentdecorator

@override

public string getdescription()

@override

public float cost()

}

package com.alvin.decorator.impl;

import com.alvin.decorator.beverage;

public class soy extends condimentdecorator

@override

public string getdescription()

@override

public float cost()

}

package com.alvin.decorator;

import com.alvin.decorator.impl.milk;

import com.alvin.decorator.impl.mocha;

import com.alvin.decorator.impl.soy;

public class run

}

執行結果

darkroast2.0

houseblendmochamilksoy1.6000001

在看乙個jdk裡面的類圖來幫助理解輸入輸出流 

設計模式(三) 裝飾者模式

裝飾者結構圖 1 component 被裝飾者的抽象類或介面,定義了新增職責的方法 2 concretecomponent 被裝飾者的具體實現類,如果只有乙個被裝飾者,concretecomponent和component可以合二為一 3 decorator 裝飾者父類,繼承component被裝飾...

設計模式(三)裝飾者模式

星巴克咖啡館想要乙份選單系統,要求能夠計算不同種類咖啡加上不同調料 牛奶 豆漿 摩卡 奶泡。的 tom做了如下實現 每個咖啡都要繼承這個飲料類,然後對是否有各種調料進行配置,然後實現cost 方法。這樣基本解決了這個問題,但是如果現在又增加了幾種飲料,是不是需要更改現在的 呢?如何才能不對以前 做修...

設計模式學習筆記(三) 裝飾者模式

同系列文章 1.設計模式學習筆記 一 策略模式 2.設計模式學習筆記 二 觀察者模式 我又來了,續更 接下來的內容是觀察者模式的學習筆記 以下正文 裝飾者模式 動態地將責任附加到物件上。若要拓展功能,裝飾者提供了比繼承更加富有彈性的替代方案。先大概看看下面的幾張圖,幫助恢復記憶 類圖 思路 以咖啡為...