上個星期買了本Head First 的《設(shè)計(jì)模式》,開始學(xué)習(xí)了設(shè)計(jì)模式了,感覺頗多。想想我就是拿著腳本語言來編程的,弄那么深奧的干嘛呢,估計(jì)是無聊吧。推薦朋友也看,他說沒有空,是啊,現(xiàn)在的年輕人沒有一個不忙的。說是讓我整理出筆記讓他看看。
這本書是針對java 寫的。沒學(xué)過java 不過語法跟flash 的腳本語言as3 還是很相似的。
另外借助于一本 《Advanced.ActionScript.3.with.Design.Patterns》,這個也是設(shè)計(jì)模式。這兩本書的區(qū)別主要在于 行文敘事,讀head first 那書感覺很有趣無需什么基礎(chǔ),讀《Advanced.ActionScript.3.with.Design.Patterns》,感覺沒有了,為什么呢?那是英文版的,我英文不好,這也是他們的第二個區(qū)別。而我的行文則是用as3 來 實(shí)現(xiàn)《設(shè)計(jì)模式》中的所有模式,基本上談實(shí)現(xiàn),不談理解。本人非程序員出身,寫的東西不太好理解哦。呵呵。
第一個首先講的是裝飾者模式:(decorator Pattern)
下面的程序代碼背景:飲料店賣一些飲料Beverage(如咖啡,茶…),在飲料中可以增加調(diào)料(如奶,糖..),使他的味道更可口些,就是說調(diào)料是來裝飾飲料的。而這一些都要錢才能享受哦。
文件格式基本上是一個類一個文件
//第一個as文件 所有飲料包括調(diào)料的基類 有一個描述方法 和一個費(fèi)用方法 package com.dp.decorator { public class Beverage { public var description : String = “unkonwn Beverage”; public function getDescription() : String { return description; } public function cost() : Number { return 0; } } } //第二個as 文件繼承自飲料,是一種具體的飲料(濃咖啡Espresso) ,所有的調(diào)料都可以來裝飾它(理論上)。 package com.dp.decorator { import com.dp.decorator.Beverage; /** * @author tkj */ public class Espresso extends Beverage { public function Espresso() { description = “Espresso”; } public override function cost() : Number { return 1.99; } } } //這是第三個as文件繼承自飲料,是一種抽象的飲料的調(diào)料CondimentDecorator,所有的調(diào)料繼承自它,(我在實(shí)現(xiàn)的時(shí)候發(fā)現(xiàn)其實(shí)所有的調(diào)料可以直接繼承自飲料也可以。),它的子類們會覆蓋它的一切。 package com.dp.decorator { import com.dp.decorator.Beverage;
/** * @author tkj */ public class CondimentDecorator extends Beverage { public function CondimentDecorator() { } public override function getDescription():String{ return description; } } } //第四個as文件,是具體的調(diào)料mocha(摩卡),它覆蓋了上面的調(diào)料類,它的構(gòu)造函數(shù)傳入的對象就是一個飲料實(shí)例。它返回的描述getDescription() 是這個調(diào)料的描述和傳入的這個實(shí)例的描述,它返回的價(jià)格cost()是這種調(diào)料的價(jià)格和傳入的實(shí)例的價(jià)格。有點(diǎn)遞歸的味道。 package com.dp.decorator { import com.dp.decorator.Beverage; import com.dp.decorator.CondimentDecorator; /** * @author tkj */ public class Mocha extends CondimentDecorator { public var yinliao : Beverage; public function Mocha(yinliao1 : Beverage) { this.yinliao = yinliao1; } public override function getDescription() : String { return yinliao.getDescription() + “.Mocha”; } public override function cost() : Number { return yinliao.cost() + 0.20; } } } //第五個as文件 是另一個調(diào)料的子類Soy豆沫跟上一個類似 package com.dp.decorator { import com.dp.decorator.Beverage; import com.dp.decorator.CondimentDecorator; /** * @author tkj */ public class Soy extends CondimentDecorator { public var yinliao : Beverage; public function Soy(yinliao1 : Beverage) { this.yinliao = yinliao1; } public override function getDescription() : String { return yinliao.getDescription() + “.Soy “; } public override function cost() : Number { return yinliao.cost() + 0.3; } } } //第六個類,就是使用上述模式了,介紹看代碼內(nèi)部的注解。 package { import flash.display.Sprite; import com.dp.decorator.*; /** * @author tkj */ public class Dinggou extends Sprite { public function Dinggou() { //點(diǎn)一種飲料,注意類型Beverage,這個是在上面所有類中的通行證.一開始沒有注意在這里摔了 var yinliao1 : Beverage = new Espresso(); //加點(diǎn)摩卡 yinliao1 = new Mocha(yinliao1); //再加點(diǎn)摩卡 yinliao1 = new Mocha(yinliao1); //加點(diǎn)豆沫 yinliao1 = new Soy(yinliao1); //再加點(diǎn)摩卡(不會還不夠吧?要不夠還可以再加哦。 yinliao1 = new Mocha(yinliao1); //夠了,結(jié)帳。 trace(yinliao1.getDescription() + “$” + yinliao1.cost()); } } }
經(jīng)典論壇討論: http://bbs.blueidea.com/thread-2836210-1-1.html
本文鏈接:http://www.95time.cn/tech/multimedia/2008/5489.asp
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
◎進(jìn)入論壇RIA設(shè)計(jì)與應(yīng)用版塊參加討論
|