重新認識裝飾模式——結合技術簡單分析

    最近小編一直在整理設計模式,和大家分享一些我最近的一些收穫吧!今天先來整理裝飾模式!

   一、說明:

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

 二、類圖:


  三、代碼實現:

//被裝飾抽象類
public abstract class Beverage{
    String description ="UnKnown Beverage";
    public String getDescription(){
        return description;
    }
    public abstract double cost();
}
//裝飾類
public abstract class CondimentDecrator extends Beverage{
    public abstract String getDescription();
}
//具體裝飾類
public class Espresso extends Beverage{
    publci Espresso(){
        description="Espresso";
    }
    public double cost(){
        return 1.99;
    }
}  
//具體的被裝飾類  
public class HouseBlend extends Beverage{
    public HouseBlend(){
        description="House Blend Coffee";
    }
    public double coust(){
        return 0.89;
    }
}
public class Mocha extends CondimentsDecorator{
    Beverage beverage;
    public Mocha(Beverage beverage){
        this.beverage=beverage;
    }
    public String getDescription(){
        return beverage.getDescription()+",Mocha";
    }
    public double cost(){
        return 0.20+beverage.cost();
    }
}
//具體main方法
public class StarbuzzCoffee{
    public static void main(String arg[]){
        Beverage beverage=new Espresso();
        System.out.println(beverage.getDescription()+"$"+beverage.cost());
        
        Beverage beverage2= new DarkRoast();
        beverage2= new Mocha(beverage2);
        beverage= new Whip(beverage2);
        System.out.println(beverage2.getDescription()+"$"+beverage2.cost());
    }
}

四、分析:
1、什麼是裝飾?
裝飾就是一種包裝,我們可以進行的包裝,也可以進行層層包裝。這個模式重點在於每層扮裝是平級的,也因此可以動態的擴展對象的功能。
2.怎麼實現的?
  包裝包含被包裝的對象+包裝的樣式。裝飾的關鍵在於CondimentsDecorator子類中Beverage的聲明,Beverage 這是被包裝的對象,通過裝飾類中聲明子類被包裝的對象,並且對該對象進行包裝,從而實現了返回一個被包裝後的對象,返回的表現是:return beverage.getDescription()+",Mocha"和 return 0.20+beverage.cost()。這兩句話一句是返回包裝後的對象名稱,另一個是返回包裝後的花費,正好是咖啡的名稱和售價。
此外我們怎麼實現對一個對象進行多層包裝?
首先每個裝飾類裏面都需要一個構造函數:
 public Mocha(Beverage beverage){
        this.beverage=beverage;
    }
這個指定我們傳入的對象,然後我們需要在main方法裏面傳入裝飾對象:
 Beverage beverage2= new DarkRoast();
 beverage2= new Mocha(beverage2);
這兩句話首先是定義一個被裝飾的對象,然後將對象傳入我們需要裝飾的方法類,這裏的傳入的方法使new一個新的裝飾類,然後給new方法加一個我們需要裝飾的對象的參數,這樣就可以進行第一層封裝了,其實這就是個給裝飾類裏面的構造函數進行初始化的過程。
然後根據參數不同,可以繼續初始化:
beverage= new Whip(beverage2);
這樣我們就實現了對象的多層裝飾,並且各層之間是平級關係。
3.裝飾能幹什麼?
  裝飾可以靈活的實現動態的組合。在面向對象設計中,儘量使用對象組合,而不是用繼承來擴展或複用功能。裝飾就很好的運用了組合,實現功能的擴展和複用。
  還可以用裝飾器來裝飾組件,但是一定要實現和組件類一致的接口,保證他們是同一個類型,並具有同一個外觀,相互澤陽才能夠遞歸的調用下去。
  裝飾還可以實現AOP的功能,可以透明的給業務功能對象增加功能!針對於裝飾實現AOP下一篇具體分析!



      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章