JS 設計模式 十二(裝飾着模式)

裝飾器模式

對客戶透明的方式動態地給一個對象附加上更多的責任,同時又不改變其結構。裝飾模式能夠在不使用創造更多子類的狀況下,將對象的功能加以擴展。ui

裝飾器要素

1.抽象構件(Component)角色:給出一個抽象接口,以規範準備接收附加責任的對象。
2.具體構件(ConcreteComponent)角色:定義一個將要接收附加責任的類。
3.裝飾(Decorator)角色:持有一個構件(Component)對象的實例,並定義一個與抽象構件接口一致的接口。
4.具體裝飾(ConcreteDecorator)角色:負責給構件對象「貼上」附加的責任。this

例子

咖啡,可加牛奶,也可加糖,或者都加。code

//裝飾着模式    
var DP = require("./DesignPattern.js");

function Icoffee() {
  DP.Interface(this, ['showCoffee', 'getPrice']);
}

function Coffee(name, price) {
  this.__proto__ = new Icoffee();
  var _name, _price;
  _name = name;
  _price = price;
  this.showCoffee = function () {
    console.log(_name + 'coffee');
  }
  this.getPrice = function () {
    return _price;
  }
}

function Decorator(Coffee) {
  var _coffee;
  _coffee = Coffee;
  this.showCoffee = function () {
    _coffee.showCoffee();
  }
  this.getPrice = function () {
    return _coffee.getPrice();
  }
}

function Sugar(Coffee) {
  this.__proto__ = new Decorator(Coffee);
  this.showCoffee = function () {
    console.log('加糖');
    this.__proto__.showCoffee();
  }
  this.getPrice = function () {
    return this.__proto__.getPrice() + 5;
  }
}

function Milk(Coffee) {
  this.__proto__ = new Decorator(Coffee);
  this.showCoffee = function () {
    console.log('加牛奶');
    this.__proto__.showCoffee();
  }
  this.getPrice = function () {
    this.__proto__.getPrice();
    return this.__proto__.getPrice() + 5;
  }
}

var coffee = new Coffee("拿鐵", 20);

var sugar = new Sugar(coffee);
sugar.showCoffee();
console.log(sugar.getPrice());
console.log('--------------------------------------------');
var milk = new Milk(coffee);
milk.showCoffee();
console.log(milk.getPrice());
console.log('--------------------------------------------');
var sugarmilk = new Milk(sugar);
sugarmilk.showCoffee();
console.log(sugarmilk.getPrice());
console.log('--------------------------------------------');
var sugarmilkmilk = new Milk(sugarmilk);
sugarmilkmilk.showCoffee();
console.log(sugarmilkmilk.getPrice());

裝飾器模式優勢:

1.裝飾類和被裝飾類能夠獨立發展,不會相互耦合。
2.裝飾模式是繼承的一個替代模式,裝飾模式能夠動態擴展一個實現類的功能。就增長功能來講,裝飾器模式相比生成子類更爲靈活。對象

適用場景:

1.擴展一個類的功能。
2.動態增長功能,動態撤銷。繼承

相關文章
相關標籤/搜索