知识卡片

策略模式与状态模式的环境角色职责差异

普通读书笔记卡 · 1866.a.6

内容

策略模式和状态模式类图几乎一样,都靠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环境角色的类,但是两者的区别很大,策略模式的环境角色只是一个委托作用,负责算法的替换;而状态模式的环境角色不仅仅是委托行为,它还具有登记状态变化的功能,与具体的状态类协作,共同完成状态切换行为随之切换的任务。