日期:2014-05-19  浏览次数:20710 次

一个设计模式的问题,100分
程序里处理过程有很多If,else,switch,case,很多和状态有关,想用状态模式(state   patter)来重构,但不知道怎么实现?请高手指点。

举个例子,由于状态变量state值不同,下面程序每次即使相同的data输入这个函数走的流程都不同,导致了很多的if,else,或swich,case,如何重构?有点类似状态机

private   int   state   =   StateA;

public   void   ProcessFlow(IData   data)
{
switch(state)
{
case   StateA:
ProcessA(data);
  ProcessB(data);
state   =   StateB;
break;  
case   StateB:
ProcessB(data);
ProcessA(data):
state   =   StateC;
break;
case   StateC:
ProcessA(data):
state   =   StateA;
break;
}
}

------解决方案--------------------
不管怎样改,类似的分支(if-else、switch-case以及配置文件里的配置项)是少不了的。

------解决方案--------------------
其实我个人来说很喜欢switch...
------解决方案--------------------
我倒是有一个方法,但有一个前提,你的private int state的值是连续的吗?
如果是的话,你可以去看看我Blog的文章,有一篇就是专门讲这个的。
http://blog.csdn.net/wzd24/archive/2007/04/10/1558982.aspx
------解决方案--------------------
用哈希表或者Dictionary 泛型集合类型,将state和对应的处理方法添加进去
可以保证你一个if..else/switch..case都不用

例如Dictionary <string,Delegate> stateDictionary = new Dictionary <string,Delegate> ();
stateDictionary.Add( "State1 ",new MethodInvoker(method));
//.....类似的状态语句行

调用时
Delegate methodInvoker = stateDictionary[ "StateName "];
methodInvoker.DynamicInvoke(new object(){ params });
------解决方案--------------------
OS_50() ( ) 信誉:100 Blog 加为好友 2007-05-15 17:24:39 得分: 0




期待 "状态模式 State Pattern "高手出现。。。

------------------------------------------------------
不解,为什么非要用状态模式??
------解决方案--------------------
这种能改吗?期待中
------解决方案--------------------
http://www.jdon.com/designpatterns/designpattern_State.htm
------解决方案--------------------
建立一个基类State,若干个子类State,基类提供统一的处理方法,子类实现这个方法
------解决方案--------------------
如果你的目的只是想简化代码提高代码的复用性,
要按你的代码的情况去用状态模式实现的话,代码量要增多
我认为用反射会模式会比较好(只做为参考和交流吧)

//以下是为代码
private int state = StateA;
hashtabl hst = new hashtable();
hst.add(stateA , "ProcessA#ProcessB ");
hst.add(stateB , "ProcessB#ProcessA ");

public void ProcessFlow(IData data)
{
string stateSort = hst[stateA ].value ;
string[] strTemps = stateSort.splice( "# ") ;
Type[] typs = type[strTemps.length] ;
for(int i=0;i <typs.lenght ;i++)
{
typs[i] = Type.GetType(strTemps[i]) ;
......
menthedInfo.Invoke( obj , new object[]{ data } );

}
state = hst.key ;
}

如果是我误解了你的意思的话,一定要用状态模式做的话:那只能把每一种状态封装为一个类
以下是我写的为代码,有些逻辑问题,只做参考,如果有何更好改进请指教

ProcessMe proMe = new ProcessMe(1) ;
proMe.DoState(data) ;


pubilc abstract class ProcessMe
{
private int state ;
IData data ;
public Process( int state){....}

abstract public DoState( IData Data ) ;

}

public class ProcessA :ProcessMe
{
Process.DoState( IData Data)