天天看點

設計模式--裝飾者模式設計模式--裝飾者模式

設計模式--裝飾者模式

設計模式--裝飾者模式設計模式--裝飾者模式

基本介紹

  • 裝飾者模式:動态的将新功能附加到對象上。在對象功能擴充方面,它比繼承更有彈性,裝飾者模式也展現了開閉原則(ocp)
  • 這種模式建立了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
  • 星巴克咖啡訂單項目:

咖啡種類/單品咖啡:Espresso(意大利濃咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(無因咖啡)

調料: Milk、Soy(豆漿)、Chocolate

要求在擴充新的咖啡種類時,具有良好的擴充性、改動友善、維護友善

使用OO的來計算不同種類咖啡的費用:客戶可以點單品咖啡,也可以單品咖啡 + 調料組合

設計模式--裝飾者模式設計模式--裝飾者模式

案例:

建立抽象類 Drink

@Data
public abstract class Drink {

    private String des;
    private float price = 0.0f;

    //子類實作
    public abstract float cost();

}           

建立coffee類繼承 抽象類

public class Coffee extends Drink{
    @Override
    public float cost() {
        return super.getPrice();
    }
}           

建立咖啡種類 :意大利咖啡

public class Espresso extends Coffee{

    public Espresso() {
        setDes(" 意大利咖啡");
        setPrice(6.0f);
    }
}           

建立咖啡種類 :longBlack

public class LongBlack extends Coffee{
    public LongBlack() {
        setDes(" longBlack");
        setPrice(7.0f);
    }
}           

建立裝飾類

public class Decorator extends Drink{
    private Drink obj;

    @Override
    public float cost() {
        //自己價格
        return super.getPrice() + obj.cost();
    }

    public Decorator(Drink obj) {
        this.obj = obj;
    }


    @Override
    public String getDes() {
        return "" + super.getPrice() + "&&" + obj.getPrice();
    }
}           

建立配料 :牛奶

public class Milk extends Decorator{
    public Milk(Drink obj) {
        super(obj);
        setDes("牛奶");
        setPrice(2.0f);
    }
}           
public class Chocolate extends Decorator{

    public Chocolate(Drink obj) {
        super(obj);
        setDes(" 巧克力 ");
        setPrice(3.0f);
    }
}           

建立配料 :巧克力

public class Chocolate extends Decorator{

    public Chocolate(Drink obj) {
        super(obj);
        setDes(" 巧克力 ");
        setPrice(3.0f);
    }
}           

建立配料 :豆漿

public class Soy extends Decorator{
    public Soy(Drink obj) {
        super(obj);
        setDes(" 豆漿 ");
        setPrice(1.5f);
    }
}           

購買coffee

public class CoffeeBar {
    public static void main(String[] args) {

        //1。點一份 logBlack
        Drink order = new LongBlack();
        System.out.println("費用1  ……   " + order.cost());
        System.out.println("描述" + order.getDes());

        //2. 加入一份牛奶
        order = new Milk(order);
        System.out.println("加入牛奶過後的費用" + order.cost());
        System.out.println("描述" + order.getDes());

        //3. 加入一份巧克力
        order = new Chocolate(order);

        System.out.println("加入牛奶 + 巧克力 過後的費用" + order.cost());
        System.out.println("描述" + order.getDes());
    }
}           
設計模式--裝飾者模式設計模式--裝飾者模式

在JDK 源碼中 Java的 IO 結構 FilterInputStream就是一個裝飾者

設計模式--裝飾者模式設計模式--裝飾者模式

個人部落格:

http://blog.yanxiaolong.cn/