裝飾器模式

裝飾器模式

  • 為對象添加新功能
  • 不改變其原有的結(jié)構(gòu)和功能

示例

zs1.png
zsuml.png
class Circle {
  draw() {
    console.log("畫一個(gè)圓形");
  }
}
class Decorator {
  constructor(circle) {
    this.circle = circle;
  }
  draw() {
    this.circle.draw();
    this.setRedBorder(circle);
  }
  setRedBorder(circle) {
    console.log("設(shè)置紅色邊框");
  }
}

const circle = new Circle();
circle.draw();

const dec = new Decorator(circle);
dec.draw();

場景

ES7 裝飾器

安裝 babel 插件

  • npm i -D babel-plugin-transform-decorators-legacy

配置.babelrc

  • 驗(yàn)證配置
@testDec
class Demo {}
function testDec(target) {
  target.isDec = true;
}
console.log(Demo.isDec);
  • mixin
function mixin(...list) {
  return function(target) {
    Object.assign(target.prototype, ...list);
  };
}

const Foo = {
  foo() {
    console.log("foo");
  }
};

@mixin(Foo)
class MyClass {}

const obj = new MyClass();
obj.foo();
  • 裝飾方法
function readonly(target, name, descriptor) {
  descriptor.writable = false;
  return descriptor;
}

class Person {
  constructor() {
    this.first = "A";
    this.last = "B";
  }

  @readonly
  name() {
    return `${this.first} ${this.last}`;
  }
}

// 測試
const p = new Person();
console.log(p.name());

p.name = 1; // 報(bào)錯(cuò), name是只讀的
function log(target, name, descriptor) {
  const oldValue = descriptor.value;
  descriptor.value = function() {
    console.log(`calling ${name} with`, arguments);
    return oldValue.apply(this, arguments);
  };
  return descriptor;
}

class Math {
  @log
  add(a, b) {
    return a + b;
  }
}

// 測試
const math = new Math();
console.log(math.add(2, 4));

core-decorators

  • 第三方開源 lib
  • 提供常用的裝飾器
  • 查閱 GitHub文檔
cd1.png
cd2.png
cd3.png

設(shè)計(jì)原則驗(yàn)證

  • 將現(xiàn)有對象和裝飾器進(jìn)行分離, 兩者獨(dú)立存在
  • 符合開放封閉原則
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 裝飾器模式 裝飾器模式是一種旨在提升代碼復(fù)用率的結(jié)構(gòu)性模式。有點(diǎn)類似于混入模式,它被認(rèn)為是一種可以替代子類的可行方...
    pws019閱讀 406評(píng)論 0 0
  • 定義 裝飾器模式又名包裝(Wrapper)模式。裝飾器模式以對客戶端透明的方式拓展對象的功能,是繼承關(guān)系的一種替代...
    步積閱讀 36,588評(píng)論 0 38
  • 前言 距離上一篇,間隔時(shí)間有點(diǎn)長哈(尷尬 ==!)經(jīng)歷過漫長的實(shí)習(xí)期,試用期,第一份工作終于慢慢走上正軌,中間發(fā)生...
    暗影飛客閱讀 1,265評(píng)論 0 0
  • 開心畫的畫(姑姑給加的濾鏡) 開心:我畫的是新娘和新郎,新娘長得很漂亮,新郎長得很帥。新娘是舅媽,新郎是舅舅。我還...
    教語文的袁老師閱讀 380評(píng)論 1 2
  • 這幾天在為“如何才能讓孩子喜歡喝牛奶”這件事發(fā)愁。 小恩恩和我一樣,天生對牛奶這件事情不感冒,不喝不鬧,喝吧還得各...
    茉莉大大閱讀 247評(píng)論 0 0

友情鏈接更多精彩內(nèi)容