设计模式行为型-状态模式
最近学习了设计模式行为型中的状态模式,这个模式的就完全体现出“多态”这种性质了,首先是它的解释:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
为什么说状态模式就体现出多态?在图上可以看出具体对象对应的状态行为有多个,而这个状态行为是由什么决定去使用呢?
主要还是通过具体对象Context这个对象的属性值的变化,通过属性值的变化我去执行一个操作(行为)时,决定使用下面三个状态行为哪一个。
在大话设计模式这本书中给状态模式举例说明的那个例子就很形象,同样一个行为,在时间不一样的时候展现出的效果是不一样的,这里的时间就是我们具体对象的属性(状态),对应到状态模式的解释中就是状态改变,而后者行为就是那个具体的动作,但是状态发生变化后他就也被改变了。
那么总结一下,这个状态模式的多态在具体的对象中体现出来的就是一个方法的实现,在不同属性(状态)下展现出来的行为是不一样的,而且这个状态模式的适用环境是一个相对确定的业务,如果想要对一个对象添加新的状态,那么这个具体的状态类只能放到原本第一个具体的状态类前面的位置,就像栈一样,这种情况下是属于可扩展的,但是相对于职责链的在外部设置上下级的这种方式还是有局限的。不过我相信还是有其他的符合开闭原则的方法来支持它的扩展性的。如果有的话希望各位不吝赐教,感谢
具体代码是根据书中例子来
抽象状态:
public abstract class State{public abstract void WriteProgram(Work w);}
具体状态行为:
//上午工作状态public class ForenoonState : State{public override void WriteProgram(Work w){
//这里的判断就是决定要用那种行为展现出来,如果 不符合当前状态,那么就去到已经设置好的下一个具体状态类中进行相同的操作。if (w.Hour < 12){Console.WriteLine("当前时间:{0}点 上午工作,精神百倍",w.Hour);}else{w.SetState(new NoonState());w.WriteProgram();}}}//中午工作状态public class NoonState : State{public override void WriteProgram(Work w){if (w.Hour < 13){Console.WriteLine("当前时间:{0}点 饿了,想吃饭;犯困,想睡觉。", w.Hour);}else{w.SetState(new AfternoonState()); w.WriteProgram();}}}//下午工作状态public class AfternoonState : State{public override void WriteProgram(Work w){if (w.Hour < 17){Console.WriteLine("当前时间:{0}点 下午状态还不错,继续努力", w.Hour);}else{w.SetState(new EveningState()); w.WriteProgram();}}}//晚上工作状态public class EveningState : State{public override void WriteProgram(Work w){if (w.TaskFinished){w.SetState(new RestState());w.WriteProgram();//完成任务就转成下班状态}else{if (w.Hour <21){Console.WriteLine("当前时间:{0}点 加班了,加班人累啊", w.Hour);}else {w.SetState(new SleepingState()); w.WriteProgram();//超过21点,转入睡眠状态}}}}//睡眠状态public class SleepingState:State{public override void WriteProgram(Work w){Console.WriteLine("当前时间:{0}点 不行了,睡着了", w.Hour);}}//下班休息状态public class RestState : State{public override void WriteProgram(Work w){Console.WriteLine("当前时间:{0}点 不行了,睡着了", w.Hour);}}
具体工作类:
public class Work{private State current;public Work(){current = new ForenoonState(); //初始化为上午9点开始上班}private double hour;public double Hour //小时钟,状态转换的依据{get { return hour; }set { hour = value; }}private bool finish = false;public bool TaskFinished //完成任务属性,是否能下班的依据{get { return finish; }set { finish = value; }}
//这个方法主要就是把具体的状态类给进来,然后让下面的方法去使用public void SetState(State s) //得到状态{current = s;}
//下面这个方法从始至终都没有发生改变,改变是其内部具体的展现值。public void WriteProgram() {current.WriteProgram(this);}}
设计模式行为型-状态模式相关推荐
- [设计模式-行为型]状态模式(State)
一句话 在一个类的对象中维护状态的类的对象 概括 解析 STATE-跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说 " ...
- 【游戏设计模式】之三 状态模式、有限状态机
转载自:https://blog.csdn.net/poem_qianmo/article/details/52824776 游戏开发过程中,各种游戏状态的切换无处不在.但很多时候,简单粗暴的if e ...
- 【游戏设计模式】之三 状态模式、有限状态机 Unity版本实现
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星云(浅 ...
- 【游戏设计模式】之三 状态模式 有限状态机 Unity版本实现
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星 ...
- 设计模式之略见一斑(状态模式State)
设计模式中的状态模式相对比较简单,简单的说就是对某个对象的状态进行管理.对象的状态如果的多的话,假如没有对其进行管理,极易造成管理混乱.从而使系统难以维护,所以State模式的意图就是将与状态有关的处 ...
- 设计模式 - 行为型 - 模板模式学习
现象: 设计模式 - 行为型 - 模板模式学习 介绍: 模板模式的设计思路,在抽象类中定义抽象方法的执行顺序, 并将抽象方法设定为只有子类实现,但不提供独立访问的方法 只能通过已经被安排好的定义方法去 ...
- 设计模式:(状态模式)
1.定义 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 co ...
- 设计模式学习笔记-状态模式
引言 使用该设计模式的情况:如在场景中的主角甚至是敌人,有N个不同状态:走路,攻击,待机.....,游戏中,这些状态来回切换.有一个明确的状态划分的情况下,此时,是可以使用Switch...case. ...
- 设计模式C++实现 ——状态模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...
最新文章
- oracle 10g
- interp3函数-----三维数据插值
- 人人可以理解的区块链100问——区块链记录哪些信息
- 【时间序列】时间序列建模的时间戳与时序特征衍生思路
- 分析约瑟夫问题(循环单链表)
- python-基础day10
- ajax使用html()后样式无效,jquery.ajax使用字符串拼接后内联css样式失效
- HashMap散列无序存储测试
- 如何在Android 4.0 ICS中禁用StatusBar | SystemBar | 状态栏 【完美版】
- bash: test1: command not found
- 无意中发现的MSDN软件下载网站
- [追加评论]三款SDR平台对比:HackRF,bladeRF和USRP
- 变桨距风力发电机液压系统设计
- 随机森林简单回归预测
- RFT 实用CODE
- 显示杂谈(1)-Gamma到底是个什么鬼
- LintCode 627.最长回文串
- Zotero | 文献关联
- 记录下UE4解决EQS Bug的过程
- Proxmox VE技巧