论坛首页 Java企业应用论坛

学习设计模式之State

浏览 12867 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-25  
模式不是万能的
难道为了少写几个ifelse就要用state模式吗
我觉得state模式不过是把if -else语句换成了一个单独的类吧了

当然,维护起来是方便些,不过类大量增加也让人烦

我到有个解决办法。。。。。。。。。。

珍爱生命,远离JAVA  :)
0 请登录后投票
   发表时间:2008-10-25  
taupo 写道
模式不是万能的
难道为了少写几个ifelse就要用state模式吗
我觉得state模式不过是把if -else语句换成了一个单独的类吧了

当然,维护起来是方便些,不过类大量增加也让人烦

我到有个解决办法。。。。。。。。。。

珍爱生命,远离JAVA  :)

大部分情况下不需要用到模式,我个人现在倾向于xp和重构那一套知识。
但很多时候用模式能够很好的解决问题。比如有30多个if else,里面有n多逻辑和接口调用。我不信一个正常的人能在短时间内明白里面的意思。

而state模式,本身的目的也不是为了替换if-else。。。如果把它理解为简单的替换。。方向就错了。。。
state的理念我认为是状态转换。也就是从某种状态转换为另外一种状态,或者有一套自己的转换过程,比如a->b->c状态,他们内部自己去管理这个状态具体是用哪一个流程来转换。类似一个复杂的开关控制面板系统。或者红绿灯。
0 请登录后投票
   发表时间:2008-10-25  
渐行渐远 写道
我不懂模式,所以每次做东西都是根据情况选取最合适的方式来设计。后来学了点模式,发现自己不知不觉用了模式,但分不清是哪一个模式,只知道那种情况下最合适。

我觉得懂模式的人往往做设计时总是先想着用什么模式来套用,而不是想着用什么样的设计最合适,陷入了模式的误区。

一点浅见,请大家批评指正


我在刚开始读很多模式书的时候也会这样,不过后来就变了,有本书改变了我的看法,就是<<refactoring to pattern.>>
读过以后我感觉现在更“深入”了些,也会在开始想到可能用到哪些模式,但开始却不去用了。。。。
0 请登录后投票
   发表时间:2008-11-03  
个人感觉从你的代码看起来你这应该是vistor pattern,而不是什么state pattern.
vistor pattern : 当新定义一个handler操作时,并不需要更改Context的结构。
而对于state pattern来说,当状态改变时,应该有state自己改变自己的行为而不是由一个handler来改变。
0 请登录后投票
   发表时间:2008-11-03  
Factroy.getHandler(context.getState());
里面还不是一样要写 if else?
0 请登录后投票
   发表时间:2009-01-04  
格外认真的看完之后,发现没什么用!
0 请登录后投票
   发表时间:2009-01-05  
楼主明显写错了。
state模式的意图就是通过state的多态来消除判断状态的分支,以楼主这个例子,实现类应该是stateFirst,stateSecond,覆盖的父类方法是printImpl:stateFirst.printImpl(){ this.print("printImplFirst: " + this.toString())}等等。
在实现类里再有类似这样的语句  if(state != null && state.equals("first")) 实在是很搞笑的事情。
另外例子也不恰当,state模式一般应用的场景还应该包括各个状态之间的转换,比如业务的状态从stateFirst在excute之后将转换为stateSecond,否则直接用多态就可以了,没必要再维护一个context
0 请登录后投票
   发表时间:2009-01-05   最后修改:2009-01-06
skeleton 写道
楼主明显写错了。
state模式的意图就是通过state的多态来消除判断状态的分支,以楼主这个例子,实现类应该是stateFirst,stateSecond,覆盖的父类方法是printImpl:stateFirst.printImpl(){ this.print("printImplFirst: " + this.toString())}等等。
在实现类里再有类似这样的语句  if(state != null && state.equals("first")) 实在是很搞笑的事情。
另外例子也不恰当,state模式一般应用的场景还应该包括各个状态之间的转换,比如业务的状态从stateFirst在excute之后将转换为stateSecond,否则直接用多态就可以了,没必要再维护一个context


状态的转换,就不说了,前面已经讨论过了.

你说的利用state的多态是状态模式消除分支的思想,
昨天看了下GoFBook总算明白了, 这个例子确实有问题....
应该不存在state--> StateHandler 而是State是个抽象类, 然后对应每一个State的子类, 有handle方法...
当然这是GoF给出的标准实现方法...但不是我想表达的思想,
我以后把这个例子重构下吧
0 请登录后投票
   发表时间:2009-01-05  
这个不就是用了抽象类和接口吗?state设计模式,貌似很多模式都用到了,寒。。。。
0 请登录后投票
   发表时间:2009-01-05  
最常见的就是dao,比如写一个basedao,然后oracledao、msdao。。都继承basedao,在弄个daofactory来生成dao,然后要新增dao的时候只需再加一个继承basedao的类就可以
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics