打印

[其它] 设计模式 Design Patterns -装饰者模式(AS3)

设计模式 Design Patterns -装饰者模式(AS3)
来自 kenjor's Blog 转载请注明出处。写的不好请原谅。第一次发读书笔记。
03月 9th, 2008
上个星期买了本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 function  cost() : 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 {
  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文件 是另一个调料的子类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;
  }
}
}
//第六个类,就是使用上述模式了,介绍看代码内部的注解。
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());
  }
}
}
[trace] Espresso.Moca.Moca.Soy .Mocha$2.89

[ 本帖最后由 kenjor01 于 2008-3-9 02:00 编辑 ]
本帖最近评分记录
  • enc0717 威望 +2 支持原創 2008-3-10 19:02
快乐每一天!
谢谢楼主分享~~~不过还是希望LZ能够说明一下该模式所应用的领域擅长解决的问题种类~~  

[ 本帖最后由 luciferzzn 于 2008-3-10 10:04 编辑 ]
模式使用的领域很广,到具体问题,我也不清楚.举个例子:有几个继承自同一个类的对象,让他们具有某些大家都可以有的装饰.

如正方形圆形都可以有阴影等滤镜,或者拖放效果.我说的不好.由于本人编程经历尚浅,还请高人赐教.不过看设计模式,收获还是颇多的,及时总结,有助于掌握,具体应用,还没有到火候.
快乐每一天!

TOP

认证您的手机,获得手机认证图标, 更多手机认证的好处
太抽象了,顶一下。
LZ不是程序员出生都这么强啊。哪天我有你一半的能力就好了啊。
其实都是照搬书上的,也谈不上什么原创啊。惭愧。
快乐每一天!

TOP

沒關係值得鼓勵
紫色的風.net
迷一样打不开的地址

TOP

记号,回家慢慢看

TOP

支持下搂主,希望能坚持写下去!
努力,努力,再努力!
目标就在前方!
我的blog:http://negy.blogone.net
专注Flash技术的网站:
http://www.cn-flash.com

TOP

为了这点威望我也得继续下去啊。开玩笑,能学就多学点。希望大家捧场。 这些例子都在 FDT 中测试过了(AS3)
快乐每一天!

TOP