轉載連接:http://blog.csdn.net/cai1213/article/details/8003445java
裝飾者模式ide
動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。測試
具體被裝飾者和抽象裝飾類都繼承於抽象被裝飾者類,繼承的是類型,而不是行爲。行爲來自裝飾者和基礎組件,或與其餘裝飾者之間的組合關係。this
裝飾者一般是用其餘相似於工廠或生成器這樣的模式建立的。spa
具體例子.net
抽象被繼承者類:Beverage.java設計
- package com.designpattern.decorator;
-
- //被裝飾者抽象類
- public abstract class Beverage {
- String description = "Unknown Beverage";
-
- public String getDescription(){
- return description;
- }
-
- public abstract double cost();
- }
具體被裝飾類:HouseBlend.java, DarkRoast.java, Decat.java, Espresso.java,只給出一個,其餘相似
- package com.designpattern.decorator;
-
- //被裝飾者具體類
- public class HouseBlend extends Beverage{
-
- public HouseBlend(){
- description = "House Blend Coffee";
- }
-
- @Override
- public double cost() {
- // TODO Auto-generated method stub
- return 0.89;
- }
-
- }
裝飾者抽象類:CondimentDecorator.java
- package com.designpattern.decorator;
-
- //裝飾者抽象類
- public abstract class CondimentDecorator extends Beverage{
- public abstract String getDescription();
- }
具體裝飾者類:Mocha.java,Soy.java,Milk.java,Whip.java,只給出一個,其餘相似
- package com.designpattern.decorator;
-
- //裝飾者的具體類
- public class Mocha extends CondimentDecorator{
- Beverage beverage;
-
- public Mocha(Beverage beverage){
- this.beverage = beverage;
- }
-
- @Override
- public String getDescription() {
- // TODO Auto-generated method stub
- return beverage.getDescription() + ", Mocha";
- }
-
- @Override
- public double cost() {
- // TODO Auto-generated method stub
- return 0.20 + beverage.cost();
- }
-
- }
測試類:Test.java
- package com.designpattern.decorator;
-
- public class Test {
- public static void main(String[] args) {
- //不須要調料,即沒有裝飾者
- Beverage beverage1 = new Espresso();
- System.out.println(beverage1.getDescription() + " $" + beverage1.cost());
-
- //使用了三個裝飾者來裝飾DarkRoast
- Beverage beverage2 = new DarkRoast();
- beverage2 = new Mocha(beverage2);
- beverage2 = new Soy(beverage2);
- beverage2 = new Whip(beverage2);
- System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
-
- //使用了兩個裝飾者來裝飾HouseBlend
- Beverage beverage3 = new HouseBlend();
- beverage3 = new Mocha(beverage3);
- beverage3 = new Soy(beverage3);
- System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
-
- }
- }
要點總結
1)繼承屬於擴展形式之一,但不見得是達到彈性設計的最佳方式。對象
2)在設計中,應該容許行爲能夠被擴展,而無須修改現有的代碼。blog
3)組合和委託可用於在運行時動態地加上新的行爲。繼承
4)除了繼承,裝飾者模式也能夠讓咱們擴展行爲。
5)裝飾者模式意味着一羣裝飾者類,這些類用來包裝具體組件。
6)裝飾者類反映出被裝飾的組件類型(事實上,他們具備相同的類型,都通過接口或繼承實現)。
7)裝飾者能夠在被裝飾者的行爲前面與/或後面加上本身的行爲,甚至將被裝飾者的行爲整個取代掉,而達到特定的目的。
8)能夠用無數個裝飾者包裝一個組件。
9)裝飾者通常對組件的客戶是透明的,除非客戶程序依賴於組件的具體類型。
10)裝飾者會致使設計中出現許多小對象,若是過分使用,會讓程序變得很複雜