注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

金融IT小鸿的博客

致力于金融IT行业

 
 
 

日志

 
 
关于我

Organize the world's information I care about and share it with other people! Change the Financial Industry through Information Technology! 爱互联网,爱金融, 爱分享,爱运动, 也爱偶尔胡思乱想! 我是金融IT小鸿

网易考拉推荐

有关ActionScript 3.0设计模式的一点思考  

2011-06-17 20:22:21|  分类: AS & Flex |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
        距离看完那本经典的《ActionScript 3.0设计模式》已经半年了,最近去Adobe参加面试被问到了这方面的东西。于是又重新回顾了一些内容,主要是行为模式。现在将自己的一些心得分享一下。
        首先面试被问到的问题是:“命令模式与观察者模式的区别是什么?”,先看类图吧(本篇文章中的所有类图均来自《ActionScript 3.0设计模式》)

有关ActionScript 3.0设计模式的一点思考 - IT小鸿 - IT小鸿的博客
观察者模式类图

有关ActionScript 3.0设计模式的一点思考 - IT小鸿 - IT小鸿的博客
命令模式类图
名词对应:

被观察对象—— ConcretSubject
观察者 —— ConcretObserver
命令发出者 —— Invoker
命令执行者 —— Receiver
命令对象 —— ConcretCommand
上下文环境对象 —— Context
策略对象 —— Strategy

       观察者模式的目的是让被观察对象将自己的状态分同步通知给注册的观察者;而命令模式的目的是通过在命令发出者命令执行者之间加入一个命令对象,从而使命令发出者命令执行者之间松耦合。命令发出者只负责指定执行一个具体的命令,具体调用哪个命令执行者,让命令执行者执行哪个方法由命令对象控制。而命令执行者只管执行分派的命令,具体是谁发出的命令命令执行者是不知道的。
       观察者模式中只涉及到两个对象之间的委托关系,被观察者委托观察者在状态变化时执行更新;而命令模式涉及到三个对象之间的委托关系,命令发出者委托命令对象执行命令,命令对象委托命令执行者进行相应的操作。
       观察者模式与命令模式有一个相似之处是:观察者模式中,被观察者可以注册多个观察者命令发出者也可以管理多个命令对象。但是,一般来说,被观察者所注册的观察对象是同步更新的,而命令发出者在执行命令的时候,一般不是同时执行,而是顺次执行。
       特殊情况,在动态观察者模式中,因为观察者可以主动让被观察者订阅自己,所以观察者被观察者之间相互都持有对方的引用,是相互委托的关系。而命令模式中,是单向的,命令发出者通过命令对象间接委托命令执行者执行命令,但是不可以反过来让命令执行者通过命令对象间接委托命令发出者

       然后,我又将其他的行为模式看了一下,发现命令模式与策略模式也比较容易混淆。要想比较好的区分,我感觉通过思考“为什么MVC模式的View与Controller 之间使用的是策略模式,而不是命令模式?”就能比较容易想明白。类图如下:


有关ActionScript 3.0设计模式的一点思考 - IT小鸿 - IT小鸿的博客
策略模式类图
 
有关ActionScript 3.0设计模式的一点思考 - IT小鸿 - IT小鸿的博客
 MVC模式元素之间的通信关系


       其实,ViewModel之间的关系完全可以是命令发出者命令执行者之间的关系,Controller来充当命令对象,这样也能达到ViewModel之间松耦合的目的。但是这样就会违背View不参与业务逻辑的要求,其实命令的发出者参与了业务逻辑,因为命令发出者决定在什么时候执行什么命令。因此我感觉命令模式与策略模式之间的最大区别就是:命令发出者参与了业务逻辑,而上下文环境对象不参与业务逻辑。其实这点也正是策略模式的目的,使用策略对象封装业务逻辑。
  
       下一阶段要开始进一步研究设计模式了,真正的编程刚刚开始!
  评论这张
 
阅读(1211)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017