State Pattern
2015-07-22 18:29
288 查看
1.每个人、事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State).State Pattern 将每一个分支都封装到独立的类中,将状态逻辑和动作实现进行分离。提高了系统的扩展性和可维护性。
2.State Pattern结构图
main.cpp
State模式在实现中的两个关键点:
(1)将State声明为Context的友元类(friend class),其作用是让State模式访问Context的protected接口ChangeSate()
(2)State及其子类中的操作都将Context*传入作为参数,其主要目的是State类可以通过这个指针调用Context中的方法(在本示例代码中没有体现)。这也是State模式和Strategy模式的最大区别所在
总结:
State模式很好地实现了对象的状态逻辑和动作实现的分离,状态逻辑分布在State的派生类中实现,而动作实现则可以放在Context类中实现(这也是为什么State派生类需要拥有一个指向Context的指针)。这使得两者的变化相互独立,改变State的状态逻辑可以很容易复用Context的动作,也可以在不影响State派生类的前提下创建Context的子类来更改或替换动作实现。
2.State Pattern结构图
#include "Context.h" #include "State.h" #include <iostream> using namespace std; int main(int argc,char* argv[]) { State* st = new ConcreteStateA(); Context* con = new Context(st); con->OperationChangState(); con->OperationChangState(); con->OperationChangState(); if (con != NULL) delete con; if (st != NULL) st = NULL; return 0; }
main.cpp
State模式在实现中的两个关键点:
(1)将State声明为Context的友元类(friend class),其作用是让State模式访问Context的protected接口ChangeSate()
(2)State及其子类中的操作都将Context*传入作为参数,其主要目的是State类可以通过这个指针调用Context中的方法(在本示例代码中没有体现)。这也是State模式和Strategy模式的最大区别所在
总结:
State模式很好地实现了对象的状态逻辑和动作实现的分离,状态逻辑分布在State的派生类中实现,而动作实现则可以放在Context类中实现(这也是为什么State派生类需要拥有一个指向Context的指针)。这使得两者的变化相互独立,改变State的状态逻辑可以很容易复用Context的动作,也可以在不影响State派生类的前提下创建Context的子类来更改或替换动作实现。
相关文章推荐
- LIS(最长的序列)和LCS(最长公共子)总结
- COMPUTER HARDWARE OPENCART 主题模板 ABC-0059
- Kafka配置文档
- 226题——Invert Binary Tree(队列,广度优先搜索)
- UVa10935 用map将string映射成int处理问题
- 【转】C/C++函数的系统调用的几种方式
- Jquery单选树
- 做的东西随便上传
- c语言,变长数组
- URL加载
- 关于 MySQL LEFT JOIN 你可能需要了解的三点
- VS调试时找不到dll或exe的方法
- cisco(思科)交换机配置篇【两】
- C# 通过反射来动态创建泛型类型
- js中(function(){})()的写法用处
- 使用Android开发照相功能小程序实例
- Associative机制使用场景[objective-c有两个扩展机制:category扩展方法和associative扩展属性]
- 在Struts2使用集合对象保存表单提交参数
- Linux stat详解(进程CPU,内存)
- The期path "" is not a valid path to the 3.11.0-15-generickernel headers