關於這個裝飾模式,其實還有很多地方還要學習,還要繼續去模仿一些情況,轉換為As可以適用的應用程式。因為要掌握到23種常見的模式,並不是一兩天的事情,還需要在實踐當中更加運用。
今天練習一個設計模式,至於對不對,看不清楚了呵呵。(辯證看待這些文章)
基本的思想是: 寫一武器基類,派生一個子類。 為了實現裝飾效果,我們寫一個寶石類,寶石類分三種寶石,紅寶石,藍寶石,綠寶石。
通過寶石的不同,能夠返回不同的屬性值。
這樣的話,我們可以通過寶石類實現對武器對象進行裝飾。裝飾技巧是在於實現前者的功能基礎上進行裝配。簡單來說,在實現裝飾對象過程,首先實現的是裝飾對象最初的功能。隨後才是其他的要裝飾的功能。
//裝飾武器某一個對象
public function Decorate(Myweapon:Weapon):void
{
this.Myweapon=Myweapon;
}
在裝飾類(寶石類)當中,我們首先調用的是裝飾對象的抽象類別對象實現調用自身的方法,這樣做不需要指出具體哪一個子類。我們可以對程式進行擴充。有助於日後修改系統。
Weapon類,武器類
package<br />{<br />public class Weapon<br />{<br />//private var _weapon:Iweapon;<br />public function Weapon( )<br />{<br />//this._weapon=_weapon;<br />}<br />public function getDescription():String<br />{<br />return null;<br />}<br />public function getValue():Number<br />{<br />return 0;</p><p>}<br />}<br />}
寶石類:
package<br />{<br />public class Diablo extends Weapon<br />{<br />//寶石的基類,為武器Weapon對象裝飾<br />private var Myweapon:Weapon;<br />public function Diablo()<br />{</p><p>}<br />//裝飾武器某一個對象<br />public function Decorate(Myweapon:Weapon):void<br />{<br />this.Myweapon=Myweapon;<br />}<br />override public function getDescription():String<br />{<br />var str:String;<br />if (this.Myweapon!=null)<br />{</p><p>str= Myweapon.getDescription();<br />}<br />return str;<br />}<br />override public function getValue():Number<br />{<br />var num:Number;<br />if (this.Myweapon!=null)<br />{</p><p>num= Myweapon.getValue();</p><p>}<br />return num;<br />}<br />}<br />}
紅寶石類:
package<br />{<br /> public class RedDiablo extends Diablo<br /> {<br /> private var value:Number=10;<br />public function RedDiablo()<br />{</p><p>}</p><p>override public function getDescription():String<br />{</p><p> return super.getDescription()+"安裝紅寶石";<br />}</p><p>override public function getValue():Number<br />{<br /> return super.getValue()+this.value;<br />}<br />}</p><p>}
藍寶石類:
package<br />{<br />public class BlueDiablo extends Diablo<br />{<br />private var value:Number=20;<br />public function BlueDiablo()<br />{</p><p>}<br />override public function getDescription():String<br />{</p><p>return super.getDescription()+"安裝藍寶石";<br />}<br />override public function getValue():Number<br />{</p><p>return super.getValue()+this.value;<br />}<br />}<br />}
綠寶石類:
package<br />{<br /> public class GreenDiablo extends Diablo<br /> {<br /> private var value:Number=30;<br />public function GreenDiablo()<br />{</p><p>}</p><p>override public function getDescription():String<br />{<br /> return super.getDescription()+"安裝綠寶石";<br />}</p><p>override public function getValue():Number<br />{<br />return super.getValue()+this.value;<br />}<br />}</p><p>}
武器A
package<br />{<br />public class WeaponA extends Weapon<br />{</p><p>public function WeaponA()<br />{</p><p>}<br />override public function getDescription():String<br />{<br />return "武器A";<br />}<br />override public function getValue():Number<br />{<br />return 0;</p><p>}<br />}<br />}
測試:
package<br />{<br />import flash.display.Sprite;<br />import flash.events.*;</p><p>public class Test extends Sprite<br />{<br />public function Test()<br />{<br />var weapon:WeaponA=new WeaponA();<br />var reddiable:RedDiablo=new RedDiablo();<br />var bluediable:BlueDiablo=new BlueDiablo();</p><p>reddiable.Decorate(weapon);//裝飾<br />bluediable.Decorate(reddiable);<br />var str:String=bluediable.getDescription();<br />var power:Number=bluediable.getValue();<br />trace(str);<br />trace(power);</p><p>}<br />}<br />}
這些程式當中還可以繼續深入,但是作為練習已經可以。