小白設計模式 裝飾者模式

2021-09-11 13:54:16 字數 3415 閱讀 3675

能夠動態的給物件增加行為職責的一種模式,靈活性遠勝於繼承。

抽象元件(component): 定義抽象行為介面。

具體元件(concrete component): 定義具體實現行為介面的類,繼承自抽象元件,也做被裝飾者,用於被附加各種行為。

抽象裝飾者(decorator):持有乙個component的引用,並繼承自component,提供其一致的介面。這邊繼承自component來達到型別匹配的效果,而不是為了利用繼承來獲取行為,行為來自裝飾者與基礎元件的組合關係

具體裝飾者(concrete decorator):負責給component元件物件新增具體的責任,繼承自decorator

抽象元件(component):

public inte***ce component 

複製**

具體元件(concrete component):

public class concretecomponent implements component

@override

public void methodb

() }

複製**

抽象裝飾者(decorator):

public abstract class decorator implements component

}複製**

具體裝飾者(concrete decorator):

public class concretedecoratora extends decorator

@override

public void methoda

() @override

public void methodb

() }

public class concretedecoratorb extends decorator

@override

public void methoda

() @override

public void methodb

() }

複製**

以銷售咖啡為例,為咖啡店設計實現飲料售價的類結構,假設存在: 咖啡種類:美式咖啡(american coffee)、英式咖啡(english coffee)、拿鐵(latte),售價分別為每杯15,16,17元。 配料種類:蒸奶(milk)、豆漿(soy)、摩卡(mocha),售價為每份3,1,2元。

beverage(對應抽象元件component):

public inte***ce beverage 

複製**

coffee(對應具體元件concrete component):

美式咖啡:

public class americancoffee implements beverage

}複製**

英式咖啡:

public class englishcoffee implements beverage

}複製**

拿鐵:

public class latte implements beverage

}複製**

調料(對應抽象裝飾者decorator):

public abstract class decorator implements beverage

}複製**

具體調料(對應具體裝飾者concrete decorator):

蒸奶:

public class milk extends decorator

@override

public float

cost

() }

複製**

豆漿:

public class soy extends decorator

@override

public float

cost

() }

複製**

摩卡:

public class mocha extends decorator

@override

public float

cost

() }

複製**

點一杯美式咖啡加蒸奶、豆漿 , 以及一杯英式咖啡加蒸奶、雙份摩卡,各自計算總價:

//計算美式咖啡加蒸奶、豆漿的總價

beverage americancoffee = new americancoffee();

float cost = new soy(new milk(americancoffee)).cost();

system.out.println(cost + "");

//計算美式咖啡加蒸奶、雙份摩卡的總價

beverage englishcoffee = new englishcoffee();

cost = new mocha(new mocha(new milk(englishcoffee))).cost();

system.out.println(cost + "");

複製**

不使用裝飾者模式,而是都統一採用繼承的方式來解決的話,會導致類數量上呈現**式增加,如下uml圖所示(只列出部分),並且這還是未考慮全部新增混合調料或者多份重複調料的情況下的一種類圖結構,數量明顯多於上面的裝飾者模式。 一旦新增加一種coffee或者新增加一種具體調料、或者修改價錢,則維護是致命的,涉及到要修改或者新增太多的類。

假設使用如下解決方法:

這種方案一旦增加一種新的調理,可能會導致所有的子類cost都需要跟著修改。並且單設增加一種產品比如"tea"是不允許新增mocha調料的,這種方案就無法避免,會引入不必要的資訊。

一種動態擴充套件的方式,比繼承更加具有靈活性。

比繼承更靈活,動態、靈活的向物件新增刪除職責,相比之下繼承要求使用前靜態建立類物件,類數量暴漲、複雜度增大

同一特性支援復用,比如用同一裝飾者多次裝飾(例如用"邊框"裝飾者裝飾2次就可以達到"雙邊框"的效果)

將特性有裝飾者實現,避免基礎類需要維護太多的特性,導致職責過於複雜

可能產生許多小物件,對不理解該結構的人來講,有點難以學習

在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責,避免因為組合而需要建立大量的之類。

設計模式 裝飾者模式

public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...

設計模式 裝飾者模式

沒什麼特別的,之前看懂了,這次自己再複述一下。畢竟把別人講懂了才是真的懂了。主要參考了head first 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...

設計模式 裝飾者模式

好幾天沒出部落格了,在學習android的一些新控制項的時候,用到了乙個模式,叫裝飾者模式,所以在此講講這個模式。模式,包含以下四個角色 1 抽象構件 component 角色 給出乙個抽象介面,以規範準備接收附加責任的物件。2 具體構件 concretecomponent 角色 定義乙個將要接收附...