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