设计模式-装饰着模式

设计原则:(开放-关闭)类应该对扩展开放,对修改关闭

装饰者:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案

缺点:导致设计中出现许多小对象,如果过度使用,会让程序变得复杂

java实现类:i/o

//抽象饮料
public abstract class Beverage {
    String description = "unknown beverage";

    public String getDescription() {
        return description;
    }

    abstract double cost();
}
//饮料类型 浓咖啡
public class Espresso extends Beverage {

    public Espresso() {
        // TODO Auto-generated constructor stub
        description = "espresso";
    }

    @Override
    double cost() {
        // TODO Auto-generated method stub
        return 1.99;
    }

}

public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}
//装饰类型 摩卡
public class Mocha extends CondimentDecorator {
    Beverage beverage;

    public Mocha(Beverage beverage) {
        // TODO Auto-generated constructor stub
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        // TODO Auto-generated method stub
        return beverage.getDescription() + ", mocha";
    }

    @Override
    double cost() {
        // TODO Auto-generated method stub
        return 0.20 + beverage.cost();
    }

}
//豆浆
public class Soy extends CondimentDecorator {
    Beverage beverage;

    public Soy(Beverage beverage) {
        // TODO Auto-generated constructor stub
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        // TODO Auto-generated method stub
        return beverage.getDescription() + ",soy";
    }

    @Override
    double cost() {
        // TODO Auto-generated method stub
        return 0.3 + beverage.cost();
    }

}
//奶泡
public class Whip extends CondimentDecorator {
    Beverage beverage;

    public Whip(Beverage beverage) {
        // TODO Auto-generated constructor stub
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        // TODO Auto-generated method stub
        return beverage.getDescription() + ",whip";
    }

    @Override
    double cost() {
        // TODO Auto-generated method stub
        return beverage.cost() + 0.4;
    }

}
public class StarbuzzCoffee {
    public static void main(String[] args) {
        //        Beverage beverage = new Espresso();
        //        System.err.println(beverage.getDescription() + ",cost" + beverage.cost());

        Beverage beverage2 = new Espresso();
        beverage2 = new Soy(beverage2);
        beverage2 = new Mocha(beverage2);
        beverage2 = new Whip(beverage2);
        System.out.println(beverage2.getDescription() + ",cost" + beverage2.cost());
    }
}
//输出结果
espresso,soy, mocha,whip,cost2.89

 

转载于:https://my.oschina.net/u/3140668/blog/1827422

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值