亲宝软件园·资讯

展开

Java装饰者模式

爱学习的大鱼​​​​​​​ 人气:0

模式介绍

23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

UML类图

类图解析:

装饰者模式案例

背景介绍:有一家咖啡店,店中有许多品种的咖啡(ShortBlack、Decaf、Espresso…),咖啡可以添加不同口味(Chocolate、Milk、Soy等),采用装饰者模式可以很好的解决该问题

装饰者下单 (2份巧克力+1份牛奶+LangBlack) 如下图所示:

类结构图

Drink、Coffee及其子类代码如下:

public abstract class Drink {
    private String des;//描述
    private float price = 0.0f;
    /**
     * 计算价格的方法
     * @return
     */
    public abstract float cost();
    public String getDes() {
        return des;
    }
    public void setDes(String des) {
        this.des = des;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
}
public class Coffee extends Drink{
    @Override
    public float cost() {
        return super.getPrice();
    }
}
public class ShortBlack extends Coffee{
    public ShortBlack() {
        setDes("浓缩咖啡");
        setPrice(4);
    }
}
public class Espresso extends Coffee{
    public Espresso() {
        setPrice(6);
        setDes("意大利咖啡");
    }
}
public class LongBlack extends Coffee{
    public LongBlack() {
        setPrice(5);
        setDes("美式咖啡");
    }
}

Decorator及其子类

public class Decorator extends Drink {
    private Drink drink;
    public Decorator(Drink drink) { // 聚合
        this.drink = drink;
    }
    @Override
    public float cost() {
        // 调料的价格 + 咖啡的价格
        return super.getPrice() + drink.cost();
    }
    @Override
    public String getDes() {
        return super.getDes() + " && " + drink.getDes();
    }
}
public class Chocolate extends Decorator{
    public Chocolate(Drink drink) {
        super(drink);
        setDes("巧克力");
        setPrice(3);
    }
}
public class Milk extends Decorator{
    public Milk(Drink drink) {
        super(drink);
        setDes("牛奶");
        setPrice(2);
    }
}
public class Soy extends Decorator{
    public Soy(Drink drink) {
        super(drink);
        setDes("豆浆");
        setPrice(1.5f);
    }
}

CoffeeBar测试类

public class CoffeeBar {
    public static void main(String[] args) {
        // 点一份咖啡
        Drink order = new LongBlack();
        System.out.println(order.cost() + "$\t" + order.getDes());

        // 加一份牛奶
        order = new Milk(order);
        System.out.println(order.cost() + "$\t" + order.getDes());

        // 加两份巧克力
        order = new Chocolate(order);
        System.out.println(order.cost() + "$\t" + order.getDes());
        order = new Chocolate(order);
        System.out.println(order.cost() + "$\t" + order.getDes());
    }
}

实现结果:

装饰者模式优点

装饰者模式缺点

加载全部内容

相关教程
猜你喜欢
用户评论