您的位置:首页 > 其它

《Head First 设计模式》之装饰者模式

2016-09-29 22:38 411 查看
作者:Grey

原文地址:http://www.cnblogs.com/greyzeng/p/5922248.html

模式名称


装饰者模式(Decorator Pattern)


需求


定义咖啡厅中的每一类咖啡,并且计算其价格。每类咖啡都可以增加配料,价钱会根据不同配料而改变。


解决方案

定义一个
Beverage
抽象类,用来表示饮料:

public abstract class Beverage {

public String description = "Unknown Description";

public String getDescription() {
return description;
}
public abstract double cost();
}

每类咖啡继承这个抽象类,实现自己的
cost()
方法,

Espresso咖啡:

public class Espresso extends Beverage {

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

HouseBlend咖啡:

public class HouseBlend extends Beverage {

HouseBlend() {
description = "HouseBlend";
}
@Override
public double cost() {
return .99d;
}
}

在这里,配料(
CondimentDecorator
)作为装饰者
,也继承自
Beverage
类,是一个抽象类:

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

具体配料继承这个装饰者,并包含一个
Beverage
类的引用,这个引用类就是要装饰的对象:

public class Mocha extends CondimentDecorator{
private Beverage beverage;
Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public double cost() {
return .2d+beverage.cost();
}

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

测试代码:

public class CoffeeTest {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println("Espresso cost : "+ beverage.cost() + " description:"+beverage.getDescription());
Beverage beverage1 = new HouseBlend();
beverage1 = new Mocha(beverage1); // HouseBlend 加一份mocha
beverage1 = new Mocha(beverage1); // HouseBlend 再加一份mocha
System.out.println("HouseBlend cost:"+beverage1.cost() + " description:"+beverage1.getDescription());
}
}

输出结果:

Espresso cost : 1.99 description:Espresso
HouseBlend cost:1.39 description:HouseBlend, Mocha, Mocha

完整代码: Decorator Pattern Source
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: