【趣味设计模式系列】之【状态模式】
1. 简介
状态模式(State Pattern),当一个对象内在状态改变
时允许其改变行为
,这个对象看起来像改变了其类。简而言之,就是状态的变更引起了行为的变更
。
2. 图解
其中,某种特定状态下,都有四个可执行操作,分别是open,close,run,stop,然后做对应的处理得下图所示。
3. 案例实现
- 定义汽车抽象状态类
CarState
,持有类型为Context
的属性,同时持有四个可执行操作,open
,close
,run
,stop
方法; - 定义汽车抽象状态类的子类
OpenningState
,ClosingState
,RunningState
,StoppingState
,分别代表开门状态,关门状态,飞奔状态,停止状态; - 定义环境角色类
Context
,把状态对象声明为静态常量,有几个状态对象就声明几个静态常量,环境角色具有状态抽象角色定义的所有行为,具体执行使用委托方式。具体环境角色有两个职责:处理本状态必须完成的任务,决定是否可以过渡到其他状态。
代码实现如下:
客户端类如下:
执行结果如下:
当只打开Client
15行的时候,分别打开11,12,13,14行的代码,会得到如下结果:
汽车为开门状态时,执行open
上述结果可以看出,同样执行一个open
方法,当状态的变化时导致行为的变化。
4. 状态模式总结
优点
- 结构清晰
避免了过多的switch...case或者if...else语句的使用,避免了程序的复杂性,提高系统的可维护性; - 遵循设计原则
很好地体现了开闭原则和单一职责原则,每个状态都是一个子类,你要增加状态就要增加子类,你要修改状态,你只修改一个子类就可以了。 - 封装性非常好
这也是状态模式的基本要求,状态变换放置到类的内部来实现,外部的调用不用知道类内部如何实现状态和行为的变换。
缺点
子类会太多,也就是类膨胀。如果一个事物有很多个状态也不稀奇,如果完全使用状态模式就会有太多的子类,不好管理,这个需要大家在项目中自己衡量。其实有很多方式可以解决这个状态问题,如在数据库中建立一个状态表,然后根据状态执行相应的操作,这个也不复杂,看大家的习惯和嗜好了。
__EOF__

本文作者:小猪爸爸
本文链接:https://www.cnblogs.com/father-of-little-pig/p/12130821.html
关于博主:不要为了技术而技术,总结分享技术,感恩点滴生活!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/father-of-little-pig/p/12130821.html
关于博主:不要为了技术而技术,总结分享技术,感恩点滴生活!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)