常见设计模式之装饰者模式(Decorator)

在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

现在有一个咖啡店,有两种咖啡,三种调料,设计一个咖啡销售系统。

//咖啡超类的设计,包含咖啡的描述,及其价钱的计算
public abstract class Beverage {
    String Description = "Unknow Beverage";

    public String getDescription() {
        return Description;
    }

    public abstract double cost();
}
//HouseBlend类咖啡的实现
public class HouseBlend extends Beverage {

    public HouseBlend() { //本咖啡描述
        super();
        Description = "House Blend Coffee";
    }

    @Override
    public double cost() {  //计算价钱
        return 0.89;
    }
}

//Espresso类咖啡的实现
public class Espresso extends Beverage {

    public Espresso() {
        super();
        Description = "Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}
//调料抽象类设计,继承Beverage可以把调料指向Beverage
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}
//抹茶调料
public class Mocha extends CondimentDecorator {

    Beverage beverage; //本身的咖啡类

    //添加调料时把饮料加进去
    public Mocha(Beverage beverage) {
        super();
        this.beverage = beverage; 
    }

    //在描述后面加上抹茶
    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }

    //价格上面加上自己的价格
    @Override
    public double cost() {
        return 0.2 + beverage.cost();
    }

}

//同理,创建一个豆浆
public class Soy extends CondimentDecorator {

    Beverage beverage;

    public Soy(Beverage beverage) {
        super();
        this.beverage = beverage;
    }

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

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

}

//同理创建一个奶泡
public class Whip extends CondimentDecorator {

    Beverage beverage;

    public Whip(Beverage beverage) {
        super();
        this.beverage = beverage;
    }

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

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

}
@Test
public void method() {
    //创建一个咖啡类,不加调料
    Beverage beverage = new Espresso();

    System.out.println(beverage.getDescription() + " $" + beverage.cost());
    //打印咖啡1:Espresso $1.99


    //创建一个咖啡类,添加两次抹茶,一次奶泡
    Beverage beverage2 = new HouseBlend();
    beverage2 = new Mocha(beverage2);
    beverage2 = new Mocha(beverage2);
    beverage2 = new Whip(beverage2);

    System.out.println(beverage2.getDescription() + " $" + beverage.cost());
    //打印咖啡2:House Blend Coffee, Mocha, Mocha, Whip $1.3900000000000001


    //创建一个咖啡类,添加豆浆,抹茶,奶泡
    Beverage beverage3 = new HouseBlend();
    beverage2 = new Soy(beverage3);
    beverage2 = new Mocha(beverage3);
    beverage2 = new Whip(beverage3);

    System.out.println(beverage3.getDescription() + " $" + beverage.cost());
    //打印咖啡3:House Blend Coffee, Soy, Mocha, Whip $1.3900000000000001
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值