装饰器模式

74 阅读1分钟

装饰器模式

代码
public abstract class Beverage {
    String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}


public abstract class CondimentDecorator extends  Beverage{
    public abstract String getDescription();
}


public class Espresso extends Beverage{
    public Espresso(){
        description = "Espresso";
    }


    public double cost() {
        return 1.99;
    }
}

public class Mocha extends CondimentDecorator{
    Beverage beverage;
    public Mocha(Beverage beverage){
        this.beverage = beverage;
    }
    @Override
    public String getDescription() {
        return beverage.getDescription() + ",mocha";
    }

    @Override
    public double cost() {
        return beverage.cost() + .20;
    }
}

public class Soy extends CondimentDecorator {
    Beverage beverage;
    public Soy(Beverage beverage){
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ",Soy";
    }

    @Override
    public double cost() {
        return beverage.cost()+ .10;
    }
}


public class Ordercoffee {
    public static void main(String[] args) {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());

        Beverage beverage1 = new Mocha(beverage);
        System.out.println(beverage1.getDescription()+ " $" + beverage1.cost());

        Beverage beverage2 = new Soy(beverage1);
        System.out.println(beverage2.getDescription()+ " $" + beverage2.cost());
    }


}

个人注解

装饰器的特点:
比继承更灵活,也能避免子类不断增加导致类爆炸

装饰器的实现:
1、必须同继承一个类对象,才能互相包装(利用组合和多态的思想,把beverge被包装类传进去)

如上例子,Beverage先定义了getDescription和抽象cost

CondimentDecorator重新把getDescription定义为抽象,就是说包装类必须重定义描述。同一个继承针对同一个方法两个类采用了a和非a的逻辑

EspressomochaSoy共属于Beverage

soy(mocha(Espresso))
 */