写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识。本来AS3出了本关于设计模式的书的,国人也翻译了。我同事也早早买了一本,但前些天我借来看了几页,翻译的太不负责任了,还不如看E文来的实在。(AS3设计模式本身写的不错,翻译的太差了)。

这里介绍一本四人组的经典之作《Head First 设计模式》。用JAVA写的,不过不懂JAVA也能看懂。JAVA,C++的经典书籍真是太多了,但AS3的经典书籍屈指可数……    看完一篇后就用AS3写一遍,算是做下学习笔记吧~~

第一篇:策略模式

定义了算法族,分别封装起来,让它们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户。

继承的弊端:在有些情况下,父类的东西会成为子类的一个累赘。文中说的一个情况具体是这样:

图一:

这是原来的框架结构,所有的子Duck继承与Duck类,Duck类有三个方法,具体类具体实现。现在的问题是:让鸭子飞起来,就是给鸭子添加一个fly()方法  下图是个错误的思路:

在父类Duck中添加了一个fly()方法,但是不应该飞的鸭子也跟着飞了起来。具体的去看看原文吧。

设计原则:

以下是用策略模式写的DUCK,主要是要理解多态的含义:

整体结构是这样的:父类:Duck    子类:WoodDuck   MalladDuck

接口:IFly  IQuack

行为类:NoFly Fly  NoQuack Quack RocketFly  用于实现IFly与IQuack两接口

具体代码:

接口:

  1. package {
  2. public  interface  IFly
  3. {
  4. function fly():void;
  5. }
  6. }
  1. package {
  2. public  interface  IQuack
  3. {
  4. function quack():void;
  5. }
  6. }

父类Duck:

  1. package
  2. {
  3. public class  Duck
  4. {
  5. protected var flyBehavior:IFly;//飞 行为接口
  6. protected var quackBehavior:IQuack;//叫 行为接口
  7. public function Duck()
  8. { }
  9. public function performFly():void
  10. {
  11. flyBehavior.fly();
  12. }
  13. public function performQuack():void
  14. {
  15. quackBehavior.quack();
  16. }
  17. public function display():void    //鸭子外观
  18. {
  19. //
  20. }
  21. //接口的动态实现
  22. public function setFlyBehavior(value:IFly):void
  23. {
  24. flyBehavior = value;
  25. }
  26. public function setQuackBehavior(value:IQuack):void
  27. {
  28. quackBehavior = value;
  29. }
  30. }
  31. }

木头鸭  不会飞 不会叫

  1. package
  2. {
  3. public class WoodDuck extends Duck
  4. {
  5. public function WoodDuck()
  6. {
  7. flyBehavior = new NoFly();
  8. quackBehavior = new NoQuack();
  9. }
  10. }
  11. }

野鸭  会飞 会叫

  1. package
  2. {
  3. public class MallardDuck extends Duck
  4. {
  5. public function MallardDuck()
  6. {
  7. flyBehavior = new Fly();
  8. quackBehavior = new Quack();
  9. }
  10. }
  11. }

实现接口的具体类:

普通飞与普通叫:

  1. package
  2. {
  3. public  class Fly implements IFly
  4. {
  5. public function fly():void
  6. {
  7. trace("FLY    FLY  ");
  8. }
  9. }
  10. }
  1. package
  2. {
  3. public class Quack implements IQuack
  4. {
  5. public function quack():void
  6. {
  7. trace("QUACK    QUACK");
  8. }
  9. }
  10. }

不会飞 不会叫  和一个用来测试的坐着火箭飞:

  1. package
  2. {
  3. public class NoFly implements IFly
  4. {
  5. public function fly():void
  6. {
  7. trace("NoFly   ");
  8. }
  9. }
  10. }
  1. package
  2. {
  3. public class NoQuack implements IQuack
  4. {
  5. public function quack():void
  6. {
  7. trace("No Quack");
  8. }
  9. }
  10. }
  1. package
  2. {
  3. public class RocketFly implements IFly
  4. {
  5. public function fly():void
  6. {
  7. trace("坐着火箭飞");
  8. }
  9. }
  10. }

文档类:

  1. package
  2. {
  3. import flash.display.Sprite;
  4. public class  Main extends Sprite
  5. {
  6. public var aDuck:WoodDuck;
  7. public var bDuck:MallardDuck;
  8. public function Main()
  9. {
  10. bDuck = new MallardDuck();
  11. bDuck.performFly();
  12. bDuck.performQuack();
  13. trace("------------------------------------");
  14. aDuck = new WoodDuck();
  15. aDuck.performFly();
  16. aDuck.performQuack();
  17. trace("--------------动态绑定-----------------------");
  18. aDuck.setFlyBehavior(new RocketFly());
  19. aDuck.performFly();
  20. }
  21. }
  22. }

输出:

FLY    FLY 
QUACK    QUACK
------------------------------------
NoFly  
No Quack
--------------动态绑定-----------------------
坐着火箭飞

----------------------------------------------------------------------------------分割线----------------------------------------------------

策略模式主要是把易于变化的部分分别封装起来,而实现他们相互之间可以替换主要是依靠向下转化。

书中的例子依然有些不便之处 ,就是Duck 并没有完全从父类Duck中拿出来 ,继承它的子类依然继承着这两个成员变量:quackBehavior和flyBehavior。具体怎么拿出来还是要继续看下哦,看到后补上~~

设计模式——策略模式( Strategy Pattern )相关推荐

  1. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  2. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  3. 设计模式-策略模式(Strategy Pattern)

    Define a family of algorithms,encapsulate each one,and make them interchangeable(定义一组算法,将每个算法都封装起来,并 ...

  4. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...

  5. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  6. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...

  7. 设计模式-策略模式(Strategy)-Java

    设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...

  8. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

  9. 设计模式--策略模式(strategy)

    1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...

最新文章

  1. PHP日期格式转时间戳
  2. java数字相减_Java的百日计划(day14)
  3. 现在上学有点赛博朋克内味儿了
  4. linux c 得到指定进程内存占用
  5. vue-cli中的webpack的config配置详细说明
  6. WordPress在前台文章页添加后台编辑该文章按钮
  7. 多项目加载顺序修改_React推出并发模式:可中断渲染、指定加载顺序、并行处理多状态...
  8. 极简好看的个人介绍页源码
  9. ipython的使用
  10. 这是一项颠覆性技术 - 容器
  11. Linux内核:内存从BIOS->e820->memblock->node/zone基本流程
  12. Response.End(); 用HttpContext.Current.ApplicationInstance.CompleteRequest 代替
  13. 字节流和字符流的读写
  14. 51单片机——LED点阵屏
  15. Ardunio开发实例-MSA301三轴加速计
  16. windows蓝屏解决方式SYSTEM_THREAD_EXCEPTION_NOT_HANDLED,失败的操作wdf01000.sys
  17. 添加腾讯007防水墙
  18. 基于matlab山脊线,基于Matlab的标记分水岭分割算法
  19. SHA256 算法实现
  20. java的Pattern类

热门文章

  1. Loom插件怎么用?Loom录屏插件使用教程
  2. 安装glib2.6x
  3. 在线靶场-墨者-网络安全2星-某防火墙默认口令
  4. Matlab App Designer 函数写法
  5. 用Python获取照片GPS信息
  6. read: unexpected EOF!
  7. 神州优车开源业界领先的增量数据同步中间件——DataLink
  8. 在线安装rancher2.4管理K8S集群并部署服务
  9. 数据加解密之Java实现Base64加密
  10. String转int数组