裝飾者模式,其中的重點天然就在「裝飾」這兩個字上面,在平常生活中不少東西都是須要裝飾的,裝飾的目的是爲了原來的物品更加的好看,或者是加個裝飾讓物品更加實用,裝飾通常都可以爲原來的物品添加一些新的功能,而添加的裝飾在添加新的功能的時候也不會改變原來的物品。javascript
那麼在編程中的裝飾其實和生活之中的裝飾也是一個道理。因此裝飾者模式的一個基本的原則就是在不改變對象自身的基礎上,在程序運行期間給對象動態的添加職責,可以使得功能變得可插拔更加的靈活。前端
下面經過一個簡單的例子來體會一下裝飾者模式:java
假設如今咱們在編寫一個飛機大戰的遊戲,隨着等級的上升咱們的飛機功能不斷的加強,一開始只能發射子彈,二級以後能夠發射導彈了,三級以後能夠發送原子彈了。web
首先實現一個飛機類:編程
var Plane = function () {} Plane.prototype.fire = function () { console.log('發射普通子彈') }
接下來添加兩個裝飾類,分別實現發射原子彈和導彈:小程序
var MissileDecorator = function (plane) { this.plane = plane } MissileDecorator.prototype.fire = function () { this.plane.fire() console.log('發射導彈') } var AtomDecorator = function (plane) { this.plane = plane } AtomDecorator.prototype.fire = function () { this.plane.fire() console.log('發射原子彈') }
導彈類和原子彈類的構造函數都接受參數plane對象,而且保留這個參數,在執行他們自身的操做以外還執行plane的fire方法。微信小程序
這樣子每被裝飾一次以後原來的類就新增了一個功能,並且原始的類也沒有被改變。微信
使用:框架
var plane = new Plane(); plane = new MissileDecorator( plane ); plane = new AtomDecorator( plane ); plane.fire(); // 分別輸出: 發射普通子彈、發射導彈、發射原子彈
從上面的例子能夠看到,每通過一次裝飾就至關於在原來的類外部包裝了一層對象,造成了一條包裝鏈,請求隨着這條包裝鏈依次傳遞到全部的對象,每一個對象都會有機會來處理這個請求。函數
做者簡介:李成文,蘆葦科技web前端開發工程師,擅長網站建設、公衆號開發、微信小程序開發、小遊戲、公衆號開發,專一於前端領域框架、交互設計、圖像繪製、數據分析等研究,訪問 www.talkmoney.cn 瞭解更多。