裝飾者設計模式舉例

代碼實現:

代碼實現:
Drink.java               被裝飾者對象的接口【豆奶繼承該接口 :飲品接口,未來可能還有其它類繼承該接口也是飲品類如汽水】
SoyaBeanMilk.java        具體的被裝飾者對象【豆奶是用下面的:雞蛋、糖、黑豆 來裝飾】
EggDecorator.java        具體裝飾者對象
SugarDecorator.java      具體裝飾者對象
BlackBeanDecorator.java  具體裝飾者對象
Decorator.java           裝飾者基類        【一般定義為抽象類:即具體的裝飾者類(雞蛋、糖、黑豆)分別是繼承它的】
Test.java                測試

Drink.java

//被裝飾者的接口(接口就是基類)
public interface Drink {
    
    float cost();          //計算價格的方法 (接口的抽象方法)
    String description();  //返回描述信息的方法(接口的抽象方法)
    
}

SoyaBeanMilk.java

//具體的被裝飾者類:豆漿類
public class SoyaBeanMilk implements Drink {

    @Override
    public float cost() {         //豆漿繼承Drink接口,必須實現接口的抽象方法
        return 10f;
    }

    @Override
    public String description() {  //豆漿繼承Drink接口,必須實現接口的抽象方法
        return "純豆漿";
    }
    
}

Decorator.java

//裝飾者的基類(是抽象類)
public abstract class Decorator implements Drink {
    private Drink drink;             //維護一個要裝飾的對象【用到適配器的知識點】
    public Decorator(Drink drink) {  //通過構造方法傳進來【抽象類可以有構造方法】
        this.drink=drink;
    }
    @Override
    public float cost() {            //Decorator也是繼承了接口Drink,必須實現接口的方法
        return drink.cost();
    }

    @Override
    public String description() {    //Decorator也是繼承了接口Drink,必須實現接口的方法
        return drink.description();
    }
    
}

SugarDecorator.java

//具體的裝飾者類:糖類
public class SugarDecorator extends Decorator {

    public SugarDecorator(Drink drink) {  //構造方法;因為父類構造方法傳入了參數,所有子類構造方法要傳入參數時,類型一定是和父類構造的傳參構造一致
        super(drink);                     //用到繼承的概念:必須顯示的調用父類的構造方法,當父類的構造方法有傳參時,無論子類構造有傳參還是無傳參
    }
    
    public float cost() {                 //重寫父類的方法
        return super.cost()+1.0f;         //super.cost()表示調用父類的方法,即調用Decorator類的cost方法
    }
    
    public String description() {         //重寫父類的方法
        return super.description()+"糖";  //super.description()表示調用父類的方法,即調用Decorator類的cost方法
    }
}

BlackBeanDecorator.java

//具體的裝飾者類:黑豆類
public class BlackBeanDecorator extends Decorator {

    public BlackBeanDecorator(Drink drink) { //構造方法;因為父類構造方法傳入了參數,所有子類構造方法要傳入參數時,類型一定是和父類構造的傳參構造一致
        super(drink);                        //用到繼承的概念:必須顯示的調用父類的構造方法,當父類的構造方法有傳參時,無論子類構造有傳參還是無傳參
    }
    
    public float cost() {                    //重寫父類的方法
        return super.cost()+2.0f;            //super.cost()表示調用父類的方法,即調用Decorator類的cost方法
    }
    
    public String description() {            //重寫父類的方法
        return super.description()+"黑豆";   //super.description()表示調用父類的方法,即調用Decorator類的cost方法
    }
}

EggDecorator.java

//具體的裝飾者類:雞蛋類
public class EggDecorator extends Decorator {

    public EggDecorator(Drink drink) {    //構造方法;因為父類構造方法傳入了參數,所有子類構造方法要傳入參數時,類型一定是和父類構造的傳參構造一致
        super(drink);                     //用到繼承的概念:必須顯示的調用父類的構造方法,當父類的構造方法有傳參時,無論子類構造有傳參還是無傳參
    }
    
    public float cost() {                 //重寫父類的方法
        return super.cost()+3.0f;         //super.cost()表示調用父類的方法,即調用Decorator類的cost方法
    }
    
    public String description() {         //重寫父類的方法
        return super.description()+"雞蛋"; //super.description()表示調用父類的方法,即調用Decorator類的cost方法
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        
//      OutputStream out = new FileOutputStream("xxx");
//      BufferedOutputStream bos = new BufferedOuputStream(out);
//      PrintStream ps = new PrintStream(bos);
//      ps.print(...);
        
        Drink drink = new SoyaBeanMilk();
        SugarDecorator sugar = new SugarDecorator(drink);
        EggDecorator egg = new EggDecorator(sugar);
        BlackBeanDecorator black = new BlackBeanDecorator(egg);
        
        System.out.println("你點的豆漿是:"+black.description());
        System.out.println("一共花了"+black.cost()+"元");
    }

}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容