设计模式-装饰者模式

88 阅读1分钟

装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更 有弹性,装饰者模式也体现了开闭原则(ocp) 这里提到的动态的将新功能附加到对象和ocp原则。

1.类图

image.png

2.代码

public abstract class Drink {

    public String desc;//描述

    public float price=0.0f;//价格

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }


    //计算费用  子类实现
    public abstract float cost();

}

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

public class LongBlack extends Coffee{

    public LongBlack(){
        setDesc("LongBlack");
        setPrice(5.0f);
    }
}

public class ShortBlack extends Coffee{

    public ShortBlack() {
        setDesc("ShortBlack");
        setPrice(4.0f);
    }
}

装饰者:

public class Decorator extends Drink{
    private Drink obj;

    @Override
    public float cost() {
        //getPrice 自己价格+传入装饰对象价格
        return super.getPrice()+obj.cost();
    }

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


    @Override
    public String getDesc() {
        //被装饰者信息
        return super.desc+" "+super.getPrice()+"&&"+obj.getDesc();
    }
}

public class Chocolate extends Decorator{
    public Chocolate(Drink obj) {
        super(obj);
        setDesc("巧克力");
        setPrice(3.0f);
    }
}

public class Milk extends Decorator{

    public Milk(Drink obj) {
        super(obj);
        setDesc("牛奶");
        setPrice(2.0f);
    }
}
public static void main(String[] args) {

    //1.点一份LongBlack
    LongBlack longBlack = new LongBlack();
    System.out.println("单品1:");
    System.out.println(longBlack.getDesc());
    System.out.println("价格:"+longBlack.cost());


    Milk milk = new Milk(longBlack);
    System.out.println("加入牛奶后:");
    System.out.println(milk.getDesc());
    System.out.println("价格:"+milk.cost());

    Chocolate chocolate = new Chocolate(milk);
    System.out.println("加入牛奶 巧克力后:");
    System.out.println(chocolate.getDesc());
    System.out.println("价格:"+chocolate.cost());

}

单品1:
LongBlack
价格:5.0
加入牛奶后:
牛奶 2.0&&LongBlack
价格:7.0
加入牛奶 巧克力后:
巧克力 3.0&&牛奶 2.0&&LongBlack
价格:10.0

应用实例:

image.png