第二篇 调整对象功能 第九章 - 装饰模式

  我们继续讨论调整对象的方法。
  相比于适配器模式转换对象类型的处理方式,装饰模式提供的方法更“温和”一些。装饰模式不改变对象的表观类型,只对对象做一些渐进式的调整
  我们继续引用《木兰诗》中的故事探讨设计思路,这里关注木兰的思亲之情。
  看下代码。

// 抒情
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))),像荷花的花瓣层层包裹着它的莲蓬。
  抽象装饰类使用了一种特殊的结构,我们将在下一章《代理模式》中进一步剖析它。

posted on 2025-03-23 17:29  星辰河岳  阅读(21)  评论(0)    收藏  举报