状态模式

来源:互联网 发布:手机淘宝哪儿有一元抢 编辑:程序博客网 时间:2024/06/07 18:37

状态模式:

GOF给出的解释是:让一个对象得行为随着内部状态的变化而变化,而该对象也像换了个类似的。

例子:

1.魔兽世界中,有一种德鲁伊的职业,他本身有好几种状态,每一种状态都可以互相切换。而不同的状态下,他的技能又不一样。玩家通过释放技能改变它本身的状态,在状态改变之后,它就想脱胎换骨一样,不仅技能变了,长相也变了。

2.qq好友有上线、离线、忙碌、等待消息等几种状态,不同状态下对好友的回复也是不一样的。

3.TCP连接有几种状态。已连接、等待连接、断开连接等。

代码:

 public abstract class State    {        protected Context context;        public State(Context context)        {            this.context = context;        }        public abstract void HandleState(int index);    }
 public class StateA : State    {        public StateA(Context context) : base(context) { }              public override void HandleState(int index)        {            if(index > 10 && index < 20)            {                this.context.SetState(new StateB(this.context));                Console.WriteLine("由状态A切换到状态B");            }else            {                this.context.SetState(new StateC(this.context));                Console.WriteLine("由状态A切换到状态C");            }        }    }
public class StateB : State    {        public StateB(Context context) : base(context) { }        public override void HandleState(int index)        {            if(index < 10)            {                this.context.SetState(new StateA(this.context));                Console.WriteLine("由状态B切换到状态A");            }else if(index > 20)            {                this.context.SetState(new StateC(this.context));                Console.WriteLine("由状态B切换到状态C");            }        }    }



public class StateC : State    {        public StateC(Context context) : base(context) { }        public override void HandleState(int index)        {            if(index < 10)            {                this.context.SetState(new StateA(this.context));                Console.WriteLine("由状态C切换到状态A");            }            else if(index < 20)            {                this.context.SetState(new StateB(this.context));                Console.WriteLine("由状态C切换到状态B");            }        }    }

public class Context    {        private State m_state;        public void SetState(State state)        {            this.m_state = state;        }        public void Request(int index)        {            m_state.HandleState(index);        }    }
他其实就是一种组合关系和简单继承关系,Context类里面有状态的父类引用,刚开始在实例化Context的时候,给它set一个子类的状态,之后的状态变化就由状态的子类来操控了。Context只是一个请求者,真正的状态切换功能还是状态子类,因为状态的子类比Context更了解该切换到哪个状态。

原创粉丝点击