装饰器模式(Decorator Pattern)

装饰器模式实现了不改变原有对象,在原有对象上实现功能的添加。这是一种对原有对象的一种包装。

装饰器模式的实例

假设现在有两个形状,一个矩形一个圆形,这时候我们希望能在形状上实现一些特殊的功能,但又不改变原来的类,我们要如何做呢?

  1. class Rectangle {
  2. draw() {
  3. console.log("Shape: Rectangle");
  4. }
  5. }
  6. class Circle {
  7. draw() {
  8. console.log("Shape: Circle");
  9. }
  10. }

这时我们可以用装饰器来实现,假设我们要给形状添加颜色功能

  1. class RedShapeDecorator {
  2. constructor(decoratedShape) {
  3. this.decoratedShape = decoratedShape;
  4. }
  5. draw() {
  6. this.decoratedShape.draw();
  7. this.setRedBorder();
  8. }
  9. setRedBorder(){
  10. console.log("Border Color: Red");
  11. }
  12. }

那么在使用装饰器的类,在画圆的时候就实现了了画边框的颜色。

  1. const circle = new Circle();
  2. const redCircle = new RedShapeDecorator(new Circle());
  3. const redRectangle = new RedShapeDecorator(new Rectangle());
  4. console.log("Circle with normal border");
  5. circle.draw();
  6. console.log("\nCircle of red border");
  7. redCircle.draw();
  8. console.log("\nRectangle of red border");
  9. redRectangle.draw();
  10. /**
  11. * output:
  12. * Circle with normal border
  13. * Shape: Circle
  14. *
  15. * Circle of red border
  16. * Shape: Circle
  17. * Border Color: Red
  18. *
  19. * Rectangle of red border
  20. * Shape: Rectangle
  21. * Border Color: Red
  22. */

装饰器模式的优势

即使原有对象发生改变,装饰器是种非侵入式功能添加,对原有对象的影响也能降低到最小。同时在JS中更方便的装饰器的实例也在提案中(https://github.com/tc39/proposal-decorators),本文写于2019年11月。

上一页(组合模式)

下一页(外观模式)