最近小編一直在整理設計模式,和大家分享一些我最近的一些收穫吧!今天先來整理裝飾模式!
一、說明:
裝飾模式:動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案
二、類圖:
三、代碼實現:
//被裝飾抽象類
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下一篇具體分析!