状态模式

状态模式:

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更了解该切换到哪个状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值