常州好一点的网站建设,百度推广免费送网站,关于一学一做的短视频网站好,wordpress 用户接口深入浅出设计模式--状态模式 一、背景二、问题三、解决方案四、 适用场景总结五、后记 一、背景
状态模式是一种行为设计模式#xff0c;让你能在一个对象的内部状态变化时改变其行为#xff0c;使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧密相关#x… 深入浅出设计模式--状态模式 一、背景二、问题三、解决方案四、 适用场景总结五、后记 一、背景
状态模式是一种行为设计模式让你能在一个对象的内部状态变化时改变其行为使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧密相关如下所示
二、问题
在实际设计编码UI界面的工作中有很多人应该都遇到过类似这样的场景当鼠标移动或者点击某个标签、按钮等组件时对应组件上会根据鼠标的状态进行不同的响应比如颜色大小的变化。如果状态有很多种那我们就会在代码中添加许多条件判断if-else、switch有时候可能一条语句中的条件多达十来个出现bug的时候调试起来相当恶心。基于这个问题下面使用状态模式逐步解决。
三、解决方案
首先在上下文类Context中定义改变状态的接口changeState并聚合了指向当前状态的IState对象指针changeState的参数即为new生成的具体状态类NormorlState等调用paintTags函数时会调用当前状态类的doPaint函数进行该状态下的绘制操作。接口状态类IState中提供了doPaint纯虚函数每个具体状态类会继承并重写doPaint在doPaint中可以调用setHoverState等函数对Context类对象的成员变量进行修改同步状态与操作。为了对每个状态类对象进行复用采用单例模式提供GetInstance函数供Context调用。 类图如下 上面的类结构中因为每个具体状态类都是单例模式提供除了名字不同之外相同的代码块因此会有许多重复代码因此想到在接口状态类IStateBase和具体状态类之间插入一个单例模板类IStateTemplate专门提供静态GetInstance函数然后每个具体状态类对其继承和模板特化这样在具体状态类中只需要实现doPaint函数即可。各类达到高度凝练与抽象每一层只专注某一功能的效果。后续如果有新加入一种状态只需要特化IStateTemplate然后重写doPaint函数即可其他状态的代码无需修改减少大量条件判断的同时也降低了出错的概率。 改进后的类图如下 该模式下各类之间交互的时序图如下 Context类关键代码截图 State相关类关键代码截图
四、 适用场景总结
如果对象需要根据自身当前状态成员变量值进行不同行为同时状态的数量非常多且与状态相关的代码会频繁变更的话可使用状态模式。当相似状态和基于条件的状态机转换中存在许多重复代码时可使用状态模式。如果状态机只有很少的几个状态或者很少发生改变那么应用该模式可能会显得小题大作。
五、后记
以上所有内容均为原创代码已上传至gayhub https://github.com/gangster-puppy/Design-Pattern.git