设计模式之装饰者模式

2020-01-04  本文已影响0人  戴先森Davi

装饰者模式

装饰者模式的定义

装饰者模式是一种“结构型”模式。

装饰者模式的使用场景

装饰者UML类图

装饰者模式UML.png

角色介绍

例子: HeadFirst一书中 星巴兹饮料例子

星巴兹饮料装饰者模式类图:


image.png

具体代码实现如下:

饮料抽象类:

public abstract class Beverage {
    protected String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

黑色烘焙饮料:

public class DarkRoast extends Beverage {

    public DarkRoast() {
        description = "Dark Roast Coffee";
    }

    @Override
    public double cost() {
        return .99;
    }

}

脱咖啡因:

public class Decaf extends Beverage {

    public Decaf() {
        description = "Decaf Coffee";
    }

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

浓咖啡:

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 .89;
    }
}

调味品装饰者抽象类:

public abstract class CondimentDecorator extends Beverage {

    @Override
    public abstract String getDescription();

}

具体装饰者:牛奶

public class Milk extends CondimentDecorator {
    private Beverage beverage;

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

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

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

具体装饰者:摩卡

public class Mocha extends CondimentDecorator {
    private Beverage beverage;

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

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

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

具体装饰者:豆浆

public class Soy extends CondimentDecorator {
    private Beverage beverage;

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

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

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

具体装饰者:奶泡

public class Whip extends CondimentDecorator {
    private Beverage beverage;

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

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

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

测试下我们的程序

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

        // 制造 DarkRoast(双倍摩卡奶泡咖啡)
        Beverage beverage2 = new DarkRoast();
        beverage2 = new Mocha(beverage2); // 使用 mocha 装饰它
        beverage2 = new Mocha(beverage2); // 使用第二个 mocha 装饰它
        beverage2 = new Whip(beverage2); // 使用 whip 装饰它
        System.out.println(beverage2.getDescription() + " $" + beverage2.cost());


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

测试结果:

Espresso 1.99 Dark Roast Coffee, Mocha, Mocha, Whip1.49
House Blend Coffee, Soy, Mocha, Whip $1.34

总结

优点

缺点

Android源码中的装饰者模式实现

参考资料
《Head First 设计模式》
《Android 源码设计模式解析与实战》

上一篇 下一篇

猜你喜欢

热点阅读