状态模式的应用

      我们在项目开发过程中,经常遇到各种的判断情况,例如根据用户当前登录的的实际判断是上午、下午、或者晚上等。这个相对比较简单,我们可以用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()//当我们请求的时候,状态也相当发生了改变;
}


   很简单吧,自己动手试试....





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值