状态模式
来源:互联网 发布:手机淘宝哪儿有一元抢 编辑:程序博客网 时间: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更了解该切换到哪个状态。
阅读全文
0 0
- 状态模式(状态变化)
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- Intellij Idea2017模块管理
- 阿里云申请的免费证书,配置到Tomcat,实现https访问
- 每日一刷——删除无头链表非尾结点&倒序打印链表
- scala不使用new关键字创建对象实例
- 大学计算机基础--2
- 状态模式
- 538. Convert BST to Greater Tree
- 源码图:HashMap+Hashtable区别
- vituralbox+CentOS7配置静态IP
- 深层神经网络——激活函数去线性化
- gcc简介及编译过程
- win7 环境下 运用maven在Idea上 搭建spark
- 第四次作业 LBG矢量量化算法
- POJ2376 Cleaning Shifts (贪心)