我们在项目开发过程中,经常遇到各种的判断情况,例如根据用户当前登录的的实际判断是上午、下午、或者晚上等。这个相对比较简单,我们可以用if else问题解决;但是若遇到算费功能(例如电费计算、中国移动每月的套餐实际的计算)就比较复杂了。如果我们在一个方法里面写太多的判断语句则针对后续维护都是很头疼的事情。我们应该尽量将这个语句进行拆分,让其更加简便。真正做到每个模块责任分解只做一个动作;不知道怎么弄了吧?好了,向大家隆重推出今天的设计模式:状态模式。
我们先看看其定义:当一个对象的内在的状态改变时运行其改变行为,这个对象看起来像改变了其类。使用状态模式的前提是我们这个状态改变后,表达式条件要过于复杂,我们才用。简单的3个以内的判断建议不要采用(这个太浪费了)。我们怎么去实现呢?其实就是将每个行为动作放到单独的一个类当中去完成;如果本类处理不了,则创建一个与至关联的另外一个具体的行为类对象,让它去处理;这个就形成了一个链条结构。我们需要新增行为可自动添加到尾部的动作就OK了。
我们来解析一下代码:
State类实际就是一个虚类,声明了一个处理方法;
abstract class State
{
public abstract void Handle(Context context);
}
具体状态类实际上就处理自己能力范围内的工作,如果处理不了,则丢给下一环节;
class ConcreteStateA:State
{
public override void Handle(Context context)
{
context.State=new ConcreteStateB();
}
}
class ConcreteStateB:State
{
public override void Handle(Context context)
{
context.State=new ConcreteStateA();
}
}
Context类保存着一个状态类 (state),当改变了状态了,则执行相应的操作;
class Context
{
private State state;
public Context(State state)
{
this.state=state;
}
public State State{
get{return state;}
set{state=value;
Console.WriteLine("目前的状态:"+state.getType().Name);
}
}
public void request()
{
state.Handle(this);
}
}
客户端代码:
static void Main(string[] args)
{
Context a=new Context(new ConcreteStateA());
a.request()//当我们请求的时候,状态也相当发生了改变;
a.request()//当我们请求的时候,状态也相当发生了改变;
}
很简单吧,自己动手试试....