對客戶透明的方式動態地給一個對象附加上更多的責任,同時又不改變其結構。裝飾模式能夠在不使用創造更多子類的狀況下,將對象的功能加以擴展。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.動態增長功能,動態撤銷。繼承