第二篇 调整对象功能 第九章 - 装饰模式
我们继续讨论调整对象的方法。
相比于适配器模式转换对象类型的处理方式,装饰模式提供的方法更“温和”一些。装饰模式不改变对象的表观类型,只对对象做一些渐进式的调整。
我们继续引用《木兰诗》中的故事探讨设计思路,这里关注木兰的思亲之情。
看下代码。
// 抒情
public interface Expressible {
public void express();
}
// 思亲之情
public class Expression implements Expressible {
@Override
public void express() {
// 不闻爷娘唤女声
}
}
// 增强的抒情(抽象装饰类)
public abstract class EnhancedExpression implements Expressible {
private Expressible obj;
public EnhancedExpression(Expressible obj) {
this.obj = obj;
}
@Override
public void express() {
this.obj.express();
}
}
// 黄河思亲(装饰类)
public class RiverExpression extends EnhancedExpression {
public RiverExpression(Expressible obj) {
super(obj);
}
@Override
public void express() {
this.enhance();
super.express();
}
private void enhance() {
// 黄河流水鸣溅溅
}
}
// 燕山思亲(装饰类)
public class HillExpression extends EnhancedExpression {
public HillExpression(Expressible obj) {
super(obj);
}
@Override
public void express() {
this.enhance();
super.express();
}
private void enhance() {
// 燕山胡骑鸣啾啾
}
}
// 测试类
public class Test {
public void test() {
// 思亲之情
Expressible obj = new Expression();
// 燕山思亲
obj = new HillExpression(obj);// 第一次装饰
// 黄河思亲
obj = new RiverExpression(obj);// 第二次装饰
obj.express();
}
}
类比较多,先梳理一下交互顺序。

obj 对象被“装饰”了两次,每次装饰都在它原始功能(express())的基础上添加了新特性(enhance())。
看得出来,装饰的本质是在原始方法的周围植入新方法,从而增强或减弱对象的功能。
从形式上看,装饰模式形成了“花苞结构”,形如 new A(new B(new C(obj))),像荷花的花瓣层层包裹着它的莲蓬。
抽象装饰类使用了一种特殊的结构,我们将在下一章《代理模式》中进一步剖析它。
浙公网安备 33010602011771号