装饰者模式

Updated on with 0 views and 0 comments

定义

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

Java实现

背景

制作咖啡时,不同的调料搭配不同的咖啡,动态的计算价钱。

超类

饮料类

public abstract class Beverage {

    String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    /**
     * 功能描述: 价钱
     *
     * @return double
     * @author liyf
     */
    public abstract double cost();
}

具体咖啡类

  • 需要为具体的咖啡设置描述,而且还必须实现cost()方法

浓缩咖啡

public class Espresso extends Beverage {

    public Espresso() {
        description = "Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}

综合咖啡

public class HouseBlend extends Beverage {

    public HouseBlend() {
        description = "House Blend Coffee";
    }

    @Override
    public double cost() {
        return 0.89;
    }
}

调料代码

调料抽象类

public abstract class CondimentDecorator extends Beverage {

    /**
     * 用一个实例变量记录饮料,也就是被装饰者
     */
    Beverage beverage;

    /**
     * 功能描述: 饮料的描述
     *
     * @return java.lang.String
     * @author liyf
     */
    @Override
    public abstract String getDescription();
}

具体调料类

  • 扩展自CondimentDecorator

摩卡

public class Mocha extends CondimentDecorator {

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

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

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

豆浆

public class Soy extends CondimentDecorator {

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

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

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

奶泡

public class Whip extends CondimentDecorator {

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

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

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

测试

  • 订一杯浓缩咖啡,不需要调料
  • 再来一杯调料为豆浆,摩卡,奶泡的综合咖啡
public class TestEspresso {

    @Test
    public void test() {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $ " + beverage.cost());

        Beverage beverage1 = new HouseBlend();
        beverage1 = new Soy(beverage1);
        beverage1 = new Mocha(beverage1);
        beverage1 = new Whip(beverage1);
        System.out.println(beverage1.getDescription() + " $ " + beverage1.cost());
    }
}

结果

Espresso $ 1.99
House Blend Coffee, Soy, Mocha, Whip $ 1.34