小编复习软考,遇到了很多模式,其中一个很有意思的就是状态模式,下面就有小编来给大家介绍一下。
what
普遍定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来形式改变了其类
自己总结:对象的行为随着状态改变
when
那么何时使用呢?这个根据定义就可知道,当对象的行为根据状态变化,并且在运行时刻根据状态变化,就考略用状态模式.也可以说,当一个对象的转换条件过于复杂的时候,使用这个模式可以使逻辑简化。
why
为什么使用呢?这个其实还是把变化的抽离出来,就是讲不同行为的状态分离出来
思考:
1、this在里面代表什么
2、state是从什么地方引用过来的
3、章台的该bain是hi怎样引起行为的改变的
4、为什么用Context作为State抽象类方法里的参数
demo
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 状态模式 { class Program { //当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变其类 static void Main(string[] args) { Context C = new Context(new ConcreteStateA()); C.Request(); C.Request(); C.Request(); Console.Read(); } abstract class State { public abstract void Handle(Context context);//为什么? 体现聚合,State调用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(); } } class Context { public State state;//为什么设置私有 public Context(State state) { this.state = state;//体现聚合,定义Context初始状态 } public void Request() { state.Handle(this);//为什么参数用this? 对请求做处理,并设置下一状态 } public State State//可读写的状态属性, 用于读取当前状态和设置新状态 为什么添加这个? { get { return state; } set { state = value; Console.WriteLine("当前状态:" + state.GetType().Name); } } } } }