在某些情况下,我们会使用大量分支。switch。
目的是为了保证状态变更。在我们使用switch的同时,我们需要维护一个动作的宏,或者列表,然后每个分支大部分都类似。如果两三个都放到一起,显不出什么影响。当状态变的复杂的时候,我们就开始,不断想办法,设置bool,来判断什么时候该换状态之类的。
这个时候最好的选择就是使用State模式。其实它不过是把每个分支都放到独立的类里面了。主要的参数,都由调用的context提供。
好处有一下几点。
1.删除和添加动作,不会影响主要的类。也明显可以感觉到实际类的代码变小。肯定要增加很多的类。
2.各个状态,会由相关调用直接约束。只要设置状态,调用就行了,每个状态自己处理,相关是否变换的动作。
3结构变清晰。让维护变得更轻松。不用在看大量代码,然后不断查找相关引用的影响之类的。
UML状态图,更多的就是表现的这个模式吧。
主要用途:
1.比如QQ的上线,隐身,吃饭等状态,如果比较少,其实可能不用影响也不大
2.MSAgent的各种表情,以及QQPET的各个活动
3.各类游戏的动作,都应该会分解成每个状态吧,因为每个状态,贴图会不一样。
4.TCP等连接变化
5.用户登陆注册
6.用户级别和银行VIP等涉及到级别的地方
我就想到这么多。在自己的RobotToy上,使用了这个模式,感觉好多了。结构清晰,使用方便。
其实使用模式,你会发现,代码变化不小,其实稍微修改,就成为了某个模式。使用了模式之后,代码变得好维护多了。
至少一个类里面参数过多,每个人都会觉得比较难找,不知道其中如何相应的,需要更多时间去了解。就算自己写的代码,一点CDialog里面代码超过1K行,你肯定也会觉得比较难以忍受。不过,唯一可以解决这一切的方法就是重构和模式的引入。