知识卡片
策略模式与状态模式的环境角色职责差异
内容
策略模式和状态模式类图几乎一样,都靠Context封装行为,但职责不同。策略模式 Context是纯委托角色——外部指定用哪个算法就调用,算法间彼此独立;状态模式Context不仅 委托,还要登记状态变化,与具体状态类协作完成”状态切换后行为随之改变”,如 ChildState.work()执行完会把Human状态设为成年人。发散:想让平行算法互换用策略模式; 状态迁移有内在顺序且引起行为改变用状态模式。
参考来源
- 位置:《设计模式之禅(第2版)》第32章《行为类模式大PK》32.2节(源文件:_epub-src/text/part0144.html)
- 结论依据:原文用"孩童/成年人/老年人"人生案例分别以策略模式和状态模式实现,代码中`ChildState.work()`执行后调用`super.human.setState(Human.ADULT_STATE)`设置下一状态,并总结"策略模式的环境角色只是一个委托作用,负责算法的替换;而状态模式的环境角色不仅仅是委托行为,它还具有登记状态变化的功能,与具体的状态类协作,共同完成状态切换行为随之切换的任务"。
- 原始内容:两者都有一个叫做Context环境角色的类,但是两者的区别很大,策略模式的环境角色只是一个委托作用,负责算法的替换;而状态模式的环境角色不仅仅是委托行为,它还具有登记状态变化的功能,与具体的状态类协作,共同完成状态切换行为随之切换的任务。