装饰模式

定义

结构

装饰模式适合用在有扩展类的行为的需求中.

例子

计算一杯咖啡的价格(总价格=咖啡类型价格+所有调料价格)

//总接口
public abstract class Beverage {

    String description = "Unknown Beverage";


    String getDescription(){
        return description;
    }

    abstract double cost();



}

//装饰接口
public abstract class CondimentDecorator extends Beverage{
    abstract String getDescription();
}
//coffee 实现类
public class DarkRoast extends Beverage {
    public DarkRoast(){
        this.description = "DarkRoast";
    }

    @Override
    double cost() {
        return 0.99;
    }


}

public class Decat extends Beverage{
    public Decat(){
        this.description = "Decat";
    }

    @Override
    double cost() {
        return 1.05;
    }

}

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

    @Override
    double cost() {
        return 1.99;
    }


}

public class HouseBlend extends Beverage{
    public HouseBlend(){
        this.description = "HouseBlend";
    }

    @Override
    double cost() {
        return 0.89;
    }

}
//调料实现类
public class Mocha extends CondimentDecorator {
    Beverage beverage;
    public Mocha(Beverage b){
        beverage = b;
    }
    @Override
    String getDescription() {
        return beverage.getDescription()+",Mocha";
    }

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

}

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

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

}

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

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

}
 public static void main(String[] args) {

        Beverage b = new Espresso();
        System.out.println(b.getDescription()+"$"+b.cost());
        Beverage b2 = new DarkRoast();
        b2 = new Mocha(b2);
        b2 = new Mocha(b2);
        b2 = new Whip(b2);
        System.out.println(b2.getDescription()+"$"+b2.cost());

    }

posted @ 2020-03-04 20:13  少年留不住  阅读(126)  评论(0编辑  收藏  举报