设计模式-装饰模式

22 阅读1分钟

定义

装饰器模式,是一种结构型设计模式,它允许将一个现有的对象添加新的功能,同时又不改变其结构。

这种类型的设计模式作为现有类的一个包装。

UML 类图

typescript 实现

1. 定义组件接口

interface Component {
  execute(): void;
}

2. 创建具体组件类

class ConcreteComponent implements Component {
  public execute(): void {
    console.log("ConcreteComponent");
  }
}

3. 创建装饰器类

abstract class Decorator implements Component {
  protected component: Component;
  constructor(component: Component) {
    this.component = component;
  }
  public execute():void {
    this.component.execute();
  }
}

4. 创建具体装饰器类

class ConcreteDecoratorA extends Decorator {
  public execute() {
    console.log("decorating A");
    super.execute();
  }
}

class ConcreteDecoratorB extends Decorator {
  public execute() {
    console.log("decorating B");
    super.execute();
  }
}

通用实现

// 公共代码
abstract class Decorator<T> {
  protected component: T;
  constructor(component: Component) {
    this.component = component;
  }
}

// 私有代码,组件接口
interface Stream {
  write(): void;
  read(): void;
}

// 私有代码,具体组件类
class FileStream {
  write() {
    console.log("write file stream");
  }
  read() {
    console.log("read file stream");
  }
}
class NetStream {
  write() {
    console.log("write net stream");
  }
  read() {
    console.log("read net stream");
  }
}

// 私有代码,装饰器类(根据功能命名)
class CryptoStream extends Decorator<Stream> implements Stream {
  constructor(stream: Stream) {
    super(stream);
  }
  write() {
    console.log("crypto stream");
    this.component.write();  }
  read() {
    console.log("crypto stream");
    this.component.read();
  }
}

// 私有代码,示例
const cryptoNetStream = new CryptoStream(new NetStream());
cryptoNetStream.write();

const cryptoFileStream = new CryptoStream(new FileStream());
cryptoFileStream.read();