本文字数为 2203 字, 预计读完大约需要 7 分钟
装饰器模式
- 定义装饰器和被装饰器的共同父类(或者父接口)
- 定义被装饰器类
- 定义装饰器类
- 用装饰器类装饰被装饰器类
- 运行我们的程序
利用组合,将同类型的对象赋予另一个同类型的对象,达到装饰的目的 在
不修改对象类型
的情况下利用继承和组合动态
增加对象的功能 继承是为了保证对象的类型,组合是为了扩展对象的功能
在Java的Io包里面大量运用了装饰器模式,比如下面这样代码:
InputStream is = new InputSteam(System.in);
BufferedInputStream bis = new BufferedInputStream(is);
下面是《Head First 设计模式》中的例子
定义装饰器和被装饰器的共同父类
/**
* 所有装饰类和被装饰类的父类
*/
public abstract class Beverage {
protected String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
下面的两个类是被装饰的类
/**
* 被装饰器类的一个子类
*/
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
/**
* 被装饰器类的一个子类
*/
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "HouseBlend";
}
public double cost() {
return .89;
}
}
下面两个类是装饰器类,他们有一个父类和两个子类
/**
* 所有装饰器的父类
*/
public abstract class CondimentDecorator extends Beverage{
protected Beverage beverage;
public CondimentDecorator(Beverage beverage) {
this.beverage = beverage;
}
public abstract String getDescription();
}
/**
* 装饰类的子类
*/
public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
@Override
public double cost() {
// 自己的价格加上它装饰的饮料的价格
return .20 + beverage.cost();
}
}
/**
* 装饰类的子类
*/
public class Whip extends CondimentDecorator {
public Whip(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Whip";
}
@Override
public double cost() {
// 自己的价格加上它装饰的饮料的价格
return .45 + beverage.cost();
}
}
测试
class Test {
private static void testDecorator() {
System.out.println("testDecorator:");
// 创建被装饰对象
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());
// 装饰对象
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
System.out.println(beverage.getDescription() + " $" + beverage.cost());
//创建另一个被装饰对象
Beverage beverage1 = new HouseBlend();
System.out.println(beverage1.getDescription() + " $" + beverage1.cost());
//装饰对象
beverage1 = new Whip(beverage1);
beverage1 = new Mocha(beverage1);
beverage1 = new Whip(beverage1);
System.out.println(beverage1.getDescription() + " $" + beverage1.cost());
}
}
输出如下
testDecorator:
Espresso $1.99
Espresso, Mocha, Mocha, Whip $2.8400000000000003
HouseBlend $0.89
HouseBlend, Whip, Mocha, Whip $1.99
本文由 MengFly 创作,采用
知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:2018-02-23 00:00:00
相关文章推荐: