摘要:所以裝飾者模式的一個基本的原則就是在不改變對象自身的基礎上,在程序運行期間給對象動態的添加職責,能夠使得功能變得可插拔更加的靈活。
標簽: 設計模式
什么是裝飾者模式?裝飾者模式,其中的重點自然就在“裝飾”這兩個字上面,在日常生活中很多東西都是需要裝飾的,裝飾的目的是為了原來的物品更加的好看,或者是加個裝飾讓物品更加實用,裝飾一般都能夠為原來的物品添加一些新的功能,而添加的裝飾在添加新的功能的時候也不會改變原來的物品。
那么在編程中的裝飾其實和生活之中的裝飾也是一個道理。所以裝飾者模式的一個基本的原則就是在不改變對象自身的基礎上,在程序運行期間給對象動態的添加職責,能夠使得功能變得可插拔更加的靈活。
模擬傳統面向對象語言的裝飾者模式下面通過一個簡單的例子來體會一下裝飾者模式:
假設現在我們在編寫一個飛機大戰的游戲,隨著等級的上升我們的飛機功能不斷的增強,一開始只能發射子彈,二級之后可以發射導彈了,三級之后可以發送原子彈了。
首先實現一個飛機類:
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 了解更多。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100292.html
摘要:裝飾者模式組成結構抽象構件給出抽象接口或抽象類,以規范準備接收附加功能的對象。裝飾者模式圖解裝飾者模式應用場景需要擴展一個類的功能,或給一個類添加附加職責。裝飾者對象接受所有來自客戶端的請求。參考資料設計模式 一、了解裝飾者模式 1.1 什么是裝飾者模式 裝飾者模式指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾者來包裹真實的對...
摘要:相關設計模式裝飾者模式和代理模式裝飾者模式關注再一個對象上動態添加方法代理模式關注再對代理對象的控制訪問,可以對客戶隱藏被代理類的信息裝飾著模式和適配器模式都叫包裝模式關于新職責適配器也可以在轉換時增加新的職責,但主要目的不在此。 0x01.定義與類型 定義:裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的...
摘要:裝飾者模式遵循了開閉原則,對擴展開放,對修改關閉。但是在使用裝飾者模式的同時可能會引入大量小類,而且使用裝飾者模式除了實例化組件外,還要把組件包裝進裝飾者,會使代碼顯得不易理解。 1. 簡介 ??裝飾者模式是一種結構型模式,它可以動態的將責任附加到對象上,在擴展功能方面,它比繼承更有彈性。裝飾者模式遵循了開閉原則,對擴展開放,對修改關閉。??雖然在裝飾者模式中也使用了繼承,但是繼承只是...
摘要:簡介代理模式和裝飾者模式是兩種常見的設計模式。這里通過構造函數的參數將被代理對象傳入到代理中,也可以通過其它方式,如提供一個方法。下面是的代碼輸出首先依然是先創建一個需要被代理的對象,然后把它傳入到的構造函數中。 簡介 代理模式和裝飾者模式是兩種常見的設計模式。代理模式是為其它對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以...
摘要:這是設計模式系列的第二篇,系列文章目錄如下用一句話總結那些殊途同歸的設計模式工廠策略模版方法美顏相機中的設計模式裝飾者模式幾乎所有的設計模式都是通過增加一層抽象來解決問題。 這是設計模式系列的第二篇,系列文章目錄如下: 用一句話總結那些殊途同歸的設計模式:工廠=?策略=?模版方法 美顏相機中的設計模式——裝飾者模式 幾乎所有的設計模式都是通過增加一層抽象來解決問題。 上一篇中提...
摘要:聲明這個系列為閱讀設計模式與開發實踐曾探著一書的讀書筆記裝飾者模式的定義裝飾者模式能夠在不改變對象自身的基礎上,在程序運行期間給對像動態的添加職責。與繼承相比,裝飾者是一種更輕便靈活的做法。裝飾者模式的作用就是為對象動態的加入某些行為。 聲明:這個系列為閱讀《JavaScript設計模式與開發實踐》 ----曾探@著一書的讀書筆記 裝飾者模式的定義: 裝飾者(decorator)模式能...
閱讀 2824·2021-11-19 11:35
閱讀 2587·2021-11-02 14:40
閱讀 1403·2021-09-04 16:48
閱讀 3013·2019-08-30 15:55
閱讀 1766·2019-08-30 13:11
閱讀 1961·2019-08-29 11:12
閱讀 1092·2019-08-27 10:52
閱讀 3162·2019-08-26 18:36