1. 程式人生 > >設計模式真香筆記-裝飾者模式

設計模式真香筆記-裝飾者模式

裝飾者模式的介紹

裝飾者模式:動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
實際中的裝飾者模式的例子:比如 java.io包的實現

裝配者模式通用的UML類圖

在這裡插入圖片描述

利用到的新原則

  • 類應該對擴充套件開放,對修改關閉

飲料和配料的例子

例子裡面cost()的圖形理解
在這裡插入圖片描述

  • Beverage(抽象抽象的元件類)
public abstract class Beverage {
    String description = "Unknown description";

    public
String getDescription() { return description; } public abstract double cost(); }
  • CondimentDecorator(調料共同實現的介面 抽象類)
public abstract class CondimentDecorator extends Beverage {//調料抽象類
        @Override
        public abstract String getDescription();
}
  • Espresso(具體飲料類 被裝飾者繼承Beverage抽象類)
public class Espresso extends  Beverage {

    public Espresso(){
        description = "beverage.Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
      }

  • HouseBlend (具體飲料類 被裝飾者繼承Beverage抽象類)
public class HouseBlend extends Beverage {
        public
HouseBlend(){ description = "House Blend Coffee"; } @Override public double cost() { return 0.89; } }
  • DarkRoast (具體飲料類 被裝飾者繼承Beverage抽象類)
public class DarkRoast extends Beverage {

        public DarkRoast(){
            description = "beverage.DarkRoast Coffee";
        }
    @Override
    public double cost() {
        return 0.99;
    }
}
  • Mocha(具體調味類 裝飾者繼承CondimentDecorator裝飾者抽象類)
public class Mocha extends CondimentDecorator {//具體裝飾者
     Beverage beverage;
     public Mocha(Beverage beverage){
         this.beverage = beverage;
     }
    @Override
    public String getDescription() {
        return beverage.getDescription()+",beverage.Mocha";
    }

    @Override
    public double cost() {
        return 0.2+beverage.cost();
    }
}
  • Soy(具體調味類 裝飾者繼承CondimentDecorator裝飾者抽象類)
public class Soy extends CondimentDecorator {
    Beverage beverage;
    public Soy(Beverage beverage){
        this.beverage = beverage;
    }
    @Override
    public String getDescription() {
        return beverage.getDescription()+",beverage.Soy";
    }

    @Override
    public double cost() {
        return 0.14+beverage.cost();
    }
}
  • Providecoffee測試類(具體如何通過裝飾者模式實現飲料的配料新增和價格的計算)
public class Providecoffee {//測試類

    public static void main(String[] args) {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription()+"   "+beverage.cost()+"¥");

        Beverage darkRoast = new DarkRoast();//製造出一個飲料物件
        darkRoast = new Mocha(darkRoast);//用mocha調料裝飾飲料物件
        darkRoast = new Mocha(darkRoast);//再用mocha調料裝飾飲料的物件
        darkRoast = new Soy(darkRoast);//最後再用soy調料裝飾飲料的物件
        System.out.println(darkRoast.getDescription()+"   "+darkRoast.cost()+"¥");//暗含者遞迴的思想列印飲料的新增和價格

    }
}

裝飾者模式的總結

  • 繼承是一種擴充套件形式,但不是一定是最佳的方案。
  • 裝飾者模式可以進行擴充套件
  • 裝飾者模式意味著一群裝飾者包裝具體的元件
  • 裝飾者會導致設計中出現許多小物件,太多了的話會讓程式變得很複雜。

本文參考 :《Head First 設計模式》