09.Javascript設計模式之裝飾器模式----Decorator
首先,我非常遺憾的要說一聲,我花了兩個小時整理的關於裝飾器模式的筆記,因為一個不可預期的故障,ADoc文檔上傳到伺服器後,檔案損壞了。
檔案毫無備份。難道是我的筆記中包含法律禁止的文字?絕對不會。算了,我還是重新整理一份吧,對此深表鬱悶。
引入正題,本文將以我這段時間對裝飾者模式的學習、理解為基礎,向大家介紹Javascript設計模式中的裝飾器模式。我的理解程度非常有限,因此文檔也不會描述的非常的周全,還請您做好心理準備。
裝飾器模式的概念
裝飾器模式動態地將職責附加到某對象上,讓該對象具備了其原本不具備的一些特性。其有別於類繼承,因為在功能擴充方面,裝飾器模式提供了比類繼承更有彈性的替代方案,而且完全不會影響到該對象在其他領域或模組中的應用。
有網友對裝飾器給出了這樣的總結,我覺得非常的好,所以摘錄了下來:
裝飾器涉及四個名詞 1、介面或者抽象基類2、被裝飾對象,也就是一個簡單的實現了1中提到的介面或者抽象基類的實作類別3、裝飾對象,就是去裝飾被裝飾對象的對象 4、繼承裝飾對象類的子類,也就是具體的裝飾器類了
裝飾器模式樣本第一個名詞
var IDecorator = new Interface("IDecorator",["sayHello"]);
第二個名詞
var DecoratorImpl = function(){};implements(DecoratorImpl,IDecorator);DecoratorImpl.prototype.sayHello = function(){ alert("Hello...");};
第三個名詞
真正的裝飾器就在這裡開始了,也是所有欲實現裝飾器的父類
var Decorator = function(decorator){ //聲明一個需要被裝飾的對象,參數從構造器中獲得 this.decorator = decorator;};implements(Decorator,IDecorator);//在基類裝飾器中只調用被裝飾對象的方法 Decorator.prototype.sayHello = function(){ //注意這裡的代碼 this.decorator.sayHello();};
再對這個裝飾器的基類說明一下,在每個裝飾器模式中,這個類的結構基本不變
或者說這上面是裝飾器第三類名詞中最小的類了,必須有以上定義的這些元素。
第四個名詞
真正的裝飾就看這裡了,Please pay attention!
var SimpleDecorator = function(decorator){ //調用父類的構造器 this.superClass.prototype.constructor.call(this,decorator);};//先進行類繼承inherits(SimpleDecorator,Decorator);//下面開始裝飾SimpleDecorator.prototype.sayHello = function(){ //在原來的方法中加入了sayChina方法 this.sayChina(); //調用父類的sayHello this.superClass.prototype.sayHello.call(this); //在原來的方法中加入sayWorld方法 this.sayWorld();};//定義這兩個後來添加的方法SimpleDecorator.prototype.sayChina = function(){ alert("China ,");};SimpleDecorator.prototype.sayWorld = function(){ alert("World!");};
大膽的開始測試
var TestDecorator = function(){ //不使用裝飾器 this.unUseDecorator = function(decorator){ decorator.sayHello(); //這裡列印:Hello }; //使用裝飾器 this.useDecorator = function(decorator){ var simpleDecorator = new SimpleDecorator(decorator); simpleDecorator.sayHello(); //這裡列印China,Hello World! };};
不要驚訝,裝飾器就是這麼強悍,把原來不變的方法改變了。
總結
那我們就來談談他的使用情境吧:
1、裝飾器模式主要裝飾供外部調用的介面方法,如果一個介面方法只是提供給內部調用,則不能使用該模式。 2、裝飾器模式主要裝飾可能要改變的介面方法,如果類中的某種行為在將來可能發生變化,而你又懶得去改變 原來的類,那麼就可以考慮使用裝飾器模式了。
OK,就說到這裡了先,再續...