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