盒子
盒子
文章目录
  1. 1. 定义共同的超类
  2. 2. 定义装饰者基类
  3. 3. 实现被装饰者具体类
  4. 4. 实现装饰者具体类

装饰者模式

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

1. 定义共同的超类

1
2
3
4
5
6
7
8
9
10
// 饮料类
public abstract class Beverage {
protected String description = "Unknown Beverage";

public abstract double cost();

public String getDescription() {
return description;
}
}

2. 定义装饰者基类

1
2
3
4
// 调料装饰者
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}

3. 实现被装饰者具体类

1
2
3
4
5
6
7
8
9
10
11
// 浓咖啡
public class DarkRoast extends Beverage {
public DarkRoast() {
description = "Dark Roast Coffee";
}

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

4. 实现装饰者具体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 摩卡调料
public class Mocha extends CondimentDecorator {
private Beverage beverage;

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

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

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

体现设计原则: 类应该对扩展开放,对修改关闭

备注:装饰者和被装饰者必须是一样的类型,也就是有共同的超类,这是相当关键的地方。在这里,我们利用继承达到“类型匹配”,而不是利 用继承获得“行为”

支持一下
扫一扫,支持沈健
  • 微信扫一扫
  • 支付宝扫一扫