请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 3622|回复: 8

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

kenjor01 楼主

寒绪

中级会员

帖子
272
体力
963
威望
8
居住地
江苏省 无锡市
发表于 2008-3-9 21:58:02 |显示全部楼层
设计模式 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(如咖啡,茶…),在饮料中可以增加调料(如奶,糖..),使他的味道更可口些,就是说调料是来装饰饮料的。而这一些都要钱才能享受哦。

文件格式基本上是一个类一个文件

  1. //第一个as文件  所有饮料包括调料的基类 有一个描述方法 和一个费用方法

  2. package com.dp.decorator {
  3. public class Beverage {

  4.   public var description : String = “unkonwn Beverage”;

  5.   
  6.   public function getDescription() : String {
  7.    return description;
  8.   }

  9.   public function cost() : Number {
  10.    return 0;
  11.   }
  12. }
  13. }

  14. //第二个as 文件继承自饮料,是一种具体的饮料(浓咖啡Espresso) ,所有的调料都可以来装饰它(理论上)。

  15. package com.dp.decorator {
  16. import com.dp.decorator.Beverage;

  17. /**
  18.   * @author tkj
  19.   */
  20. public class Espresso extends Beverage {
  21.   public function Espresso() {
  22.    description = “Espresso”;
  23.   }

  24.   public override function  cost() : Number {
  25.    return 1.99;
  26.   }
  27. }
  28. }

  29. //这是第三个as文件继承自饮料,是一种抽象的饮料的调料CondimentDecorator,所有的调料继承自它,(我在实现的时候发现其实所有的调料可以直接继承自饮料也可以。),它的子类们会覆盖它的一切。

  30. package com.dp.decorator {
  31. import com.dp.decorator.Beverage;

  32. /**
  33.   * @author tkj
  34.   */
  35. public class CondimentDecorator extends Beverage {
  36.   public function CondimentDecorator() {
  37.    
  38.   }
  39.   public override function getDescription():String{
  40.    return description;
  41.   
  42.   }
  43. }
  44. }

  45. //第四个as文件,是具体的调料mocha(摩卡),它覆盖了上面的调料类,它的构造函数传入的对象就是一个饮料实例。它返回的描述getDescription() 是这个调料的描述和传入的这个实例的描述,它返回的价格cost()是这种调料的价格和传入的实例的价格。有点递归的味道。
  46. package com.dp.decorator {
  47. import com.dp.decorator.Beverage;
  48. import com.dp.decorator.CondimentDecorator;

  49. /**
  50.   * @author tkj
  51.   */
  52. public class Mocha extends CondimentDecorator {
  53.   public  var yinliao : Beverage;
  54.   public function Mocha(yinliao1 : Beverage) {
  55.    this.yinliao = yinliao1;
  56.    
  57.   }

  58.   public override function  getDescription() : String {
  59.    return yinliao.getDescription() + “.Mocha”;
  60.   }

  61.   public override function cost() : Number {
  62.    return yinliao.cost() + 0.20;
  63.   }
  64. }
  65. }

  66. //第五个as文件 是另一个调料的子类Soy豆沫跟上一个类似

  67. package com.dp.decorator {
  68. import com.dp.decorator.Beverage;
  69. import com.dp.decorator.CondimentDecorator;

  70. /**
  71.   * @author tkj
  72.   */
  73. public class Soy extends CondimentDecorator {
  74.   public  var yinliao : Beverage;
  75.   public function Soy(yinliao1 : Beverage) {
  76.    this.yinliao = yinliao1;
  77.    
  78.   }

  79.   public override function  getDescription() : String {
  80.    return yinliao.getDescription() + “.Soy “;
  81.   }

  82.   public override function cost() : Number {
  83.    return yinliao.cost() + 0.3;
  84.   }
  85. }
  86. }

  87. //第六个类,就是使用上述模式了,介绍看代码内部的注解。

  88. package {
  89. import flash.display.Sprite;
  90. import com.dp.decorator.*;

  91. /**
  92.   * @author tkj
  93.   */
  94. public class Dinggou extends Sprite {
  95.   public function Dinggou() {

  96. //点一种饮料,注意类型Beverage,这个是在上面所有类中的通行证.一开始没有注意在这里摔了
  97.    var yinliao1 : Beverage = new Espresso();

  98. //加点摩卡
  99.    yinliao1 = new Mocha(yinliao1);

  100. //再加点摩卡
  101.    yinliao1 = new Mocha(yinliao1);
  102. //加点豆沫

  103.    yinliao1 = new Soy(yinliao1);

  104. //再加点摩卡(不会还不够吧?要不够还可以再加哦!)
  105.    yinliao1 = new Mocha(yinliao1);

  106. //够了,结帐。
  107.    trace(yinliao1.getDescription() + “$” + yinliao1.cost());
  108.   }
  109. }
  110. }
复制代码

[trace] Espresso.Moca.Moca.Soy .Mocha$2.89

[ 本帖最后由 kenjor01 于 2008-3-9 02:00 编辑 ]
已有 1 人评分威望 收起 理由
enc0717 + 2 支持原創

总评分: 威望 + 2   查看全部评分

快乐每一天!
西部数码顶级域名注册商39元抢注!

larry的马甲

银牌会员

帖子
463
体力
1209
威望
0
发表于 2008-3-10 10:02:51 |显示全部楼层
谢谢楼主分享~~~不过还是希望LZ能够说明一下该模式所应用的领域擅长解决的问题种类~~  

[ 本帖最后由 luciferzzn 于 2008-3-10 10:04 编辑 ]
!(world.light)?i.say("let it be light!",world):.
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

kenjor01 楼主

寒绪

中级会员

帖子
272
体力
963
威望
8
居住地
江苏省 无锡市
发表于 2008-3-10 18:37:57 |显示全部楼层
模式使用的领域很广,到具体问题,我也不清楚.举个例子:有几个继承自同一个类的对象,让他们具有某些大家都可以有的装饰.

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

使用道具 举报

帖子
150
体力
629
威望
0
居住地
湖北省 武汉市
发表于 2008-3-10 19:30:50 |显示全部楼层
太抽象了,顶一下。
LZ不是程序员出生都这么强啊。哪天我有你一半的能力就好了啊。

使用道具 举报

kenjor01 楼主

寒绪

中级会员

帖子
272
体力
963
威望
8
居住地
江苏省 无锡市
发表于 2008-3-10 21:40:31 |显示全部楼层
其实都是照搬书上的,也谈不上什么原创啊。惭愧。
快乐每一天!

使用道具 举报

Einesce

荣誉管理

帖子
6153
体力
14139
威望
52
居住地
香港特别行政区 湾仔区
发表于 2008-3-11 10:13:06 |显示全部楼层
沒關係值得鼓勵
purple.Starpulse

使用道具 举报

lkele 
帖子
138
体力
304
威望
0
居住地
广东省 深圳市
发表于 2008-3-11 13:29:08 |显示全部楼层
记号,回家慢慢看

使用道具 举报

negy 

迎风轻扬

银牌会员

帖子
178
体力
1288
威望
0
发表于 2008-3-12 00:26:29 |显示全部楼层
支持下搂主,希望能坚持写下去!
努力,努力,再努力!
目标就在前方!

使用道具 举报

kenjor01 楼主

寒绪

中级会员

帖子
272
体力
963
威望
8
居住地
江苏省 无锡市
发表于 2008-3-12 15:06:40 |显示全部楼层
为了这点威望我也得继续下去啊。开玩笑,能学就多学点。希望大家捧场。 这些例子都在 FDT 中测试过了(AS3)
快乐每一天!

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 13:02 , Processed in 0.106028 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部