装饰者模式

来源:互联网 发布:mac双系统win8.1激活 编辑:程序博客网 时间:2024/05/21 22:46

案例:咖啡店想建立生成订单的程序。订单要有咖啡的种类、加的调料种类以及它们的价格。以后可能出现新的调料,有的咖啡不能添加某种调料。

学到的新的原则:对扩展开放,对修改关闭。(本例中用低藕的组合代替了高藕的继承。是对于扩展功能,有别于继承的另一种选择)

装饰者模式:动态的将责任添加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。

解决方案:咖啡作为 被装饰者,调料作为装饰者。装饰者将 被装饰者或者 装饰过的被装饰者包(装饰)起来,利用这种组合的方式,为被装饰者提供新功能,避免继承。有多重嵌套的意味。而且也因此,装饰者与被装饰者继承于同一个超类,这样装饰者才能装饰 被装饰过的被装饰者。

public abstract class Beverage {//装饰者和被装饰者共同继承的父类    String description;    public String getDescription(){        return description;    }    public abstract double cost();}public abstract class DecoratorCondiment extends Beverage {//装饰者的父类    Beverage beverage;    public abstract String getDescription();    @Override    public double cost() {        return 0;    }}public class Mocha extends DecoratorCondiment {    public Mocha(Beverage beverage){//呈现组合关系。传入被装饰者,为其添加新功能        this.beverage = beverage;        description = "Mocha";    }    public double cost(){        return beverage.cost() + .20;    }    @Override    public String getDescription() {        return description + beverage.getDescription();    }}public class Esprreso extends Beverage {//被装饰者    public Esprreso(){        description = "Esprreso";    }    @Override    public double cost() {        return 1.99;    }}

原创粉丝点击