装饰者模式

来源:互联网 发布:手机能做淘宝链接 编辑:程序博客网 时间:2024/05/29 08:09

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

这里写图片描述

下边我们以购买咖啡为例,说明装饰者模式。购买咖啡时,也可以要求在其加入各种调料,例如:摩卡、奶泡。咖啡店根据加入的调料收取不同的费用。

1. 饮料基类

public abstract class AbstractBeverage {    String description = "Unknown Beverage";    public String getDescription() {        return description;    }    public abstract double cost();}

2. 浓缩咖啡

public class Espresso extends AbstractBeverage {    public Espresso() {        description = "Espresso";    }    @Override    public double cost() {        return 1.99;    }}

3. 混合饮料

public class HouseBlend extends AbstractBeverage{    public HouseBlend() {        description = "HouseBlend";    }    @Override    public double cost() {        return 0.89;    }}

4. 装饰者基类

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

5. 摩卡调料

public class Mecha extends CondimentDecorator{    private AbstractBeverage beverage;    public Mecha(AbstractBeverage beverage) {        this.beverage = beverage;    }    @Override    public String getDescription() {        return beverage.getDescription() + ", Mocha";    }    @Override    public double cost() {        return 0.20 + beverage.cost();    }}

6. 奶油调料

public class Whip extends CondimentDecorator{    private AbstractBeverage beverage;    public Whip(AbstractBeverage beverage) {        this.beverage = beverage;    }    @Override    public String getDescription() {        return beverage.getDescription() + ", Whip";    }    @Override    public double cost() {        return 0.10 + beverage.cost();    }}

7. 测试

public class DecoratorTest {    public static void main(String[] args) {        AbstractBeverage espresso = new Espresso();        AbstractBeverage houseBlend = new HouseBlend();        //未加装饰者        System.out.println(espresso.getDescription() + " $" + espresso.cost());        espresso = new Mecha(espresso);        espresso = new Mecha(espresso);        espresso = new Whip(espresso);        System.out.println(espresso.getDescription() + " $" + espresso.cost());        //未加装饰者        System.out.println(houseBlend.getDescription() + " $" + houseBlend.cost());        houseBlend = new Mecha(houseBlend);        houseBlend = new Whip(houseBlend);        System.out.println(houseBlend.getDescription() + " $" + houseBlend.cost());    }}

8. 运行结果

Espresso $1.99Espresso, Mocha, Mocha, Whip $2.49HouseBlend $0.89HouseBlend, Mocha, Whip $1.1900000000000002
原创粉丝点击