Decorator(装饰者) 结构型 对象 1
Intent_意图2
动态地将责任附加到对象上。
Motivation_动机3
一般为了扩展类的功能,经常会选择使用继承的方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀
Applicability_适用性4
1.在不想增加过多子类的情况下扩展类
Structure_结构5
Participants_参与者6
- Component(抽象构件) 定义一个抽象类(或接口)以规范准备接收附加责任的对象
- ConcreteComponent(具体构件) 继承(或实现)Component,通过装饰角色为其添加一些职责
- Decorator(抽象装饰) 继承(或实现)Component,并包含ConcreteComponent的实例,可以通过子类扩展ConcreteComponent的功能
- ConcreteDecorator(具体装饰) 实现Decorator的相关方法,并给ConcreteComponent对象添加附加责任
Collaborations_协作7
Component定义一个抽象类(或接口)
->ConcreteComponent继承(或实现)Component
->Decorator继承(或实现)Component
->ConcreteDecorator实现Decorator的方法,并给ConcreteComponent对象附加新的职责
依赖继承来扩展装饰者,以达到“类型匹配”的目的,类的行为只能在编译时静态决定
采用接口来扩展装饰者,以达到自由组合的目的,类的行为在运行时动态添加
Comsequences_结果8
- 优点
对比于继承来扩展对象的功能,装饰者模式有更好的弹性
装饰者可以在被装饰者的行为前面/后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的
可以用无数个装饰者包装一个组件
装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型 - 缺点
装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂 - 用途
扩展一个类的功能
动态增加功能,动态撤销
Implementation/Sample Code_实现/范例代码910
Implementation
Component
public abstract Component {
public void sampleOperation();
}
ConcreteComponent
public class ConcreteComponent extends Component {
@Override
public void sampleOperation() {
// TODO
}
}
Decorator
public class Decorator extends Component {
private Component commponent;
public Decorator(Component component) {
this.component = component;
}
@Override
public void sampleOperation() {
commponent.sampleOperation();
}
}
ConcreteDecorator
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void sampleOperation() {
super.sampleOperation();
// TODO
}
}
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
@Override
public void sampleOperation() {
super.sampleOperation();
// TODO
}
}
Sample Code
Component
public abstract class Beverage {
String description = "Unknow Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
ConcreteComponent
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
Decorator
public abstract class CondimentDecorator extends Beverage {
Beverage beverage;
public CondimentDecorator(Beverage beverage) {
this.beverage = beverage;
}
public abstract String getDescription();
}
ConcreteDecorator
public class Whip extends CondimentDecorator {
public Whip(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Whip";
}
@Override
public double cost() {
return .10 + beverage.cost();
}
}
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();
}
}
Demo
public class CoffeeShop {
public static void main(String[] args) {
Beverage espresso = new Espresso();
System.out.println(espresso.getDescription() + " $" + espresso.cost());
espresso = new Mocha(espresso);
espresso = new Whip(espresso);
System.out.println(espresso.getDescription() + " $" + espresso.cost());
}
}
Result
Espresso $1.99
Espresso, Mocha, Whip $2.29
Known Uses_已知应用11
Related Patterns_相关模式12
模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎