[GoF设计模式]Flyweight模式和State模式的C++实现
来源:互联网 发布:生死狙击矩阵怎么刷 编辑:程序博客网 时间:2024/06/10 17:39
【Flyweight模式】
一个应用程序创建了太多的对象,会造成很大的存储开销,特别是大量轻量级的对象。对于这种情况,可以将对象的状态分成外部状态和内部状态,将可以被共享(不变化)的状态作为内部状态存储在对象中,而外部状态则可以将外部对象作为参数传递给对象。Flyweight有一个类似工厂模式的对象构造工厂,当程序需要一个对象时就会向FlyweightFactory发出请求对象的消息,该工厂拥有一个管理、存储对象的仓库(或者称为对象池),FlyweightFactory中会遍历对象池,如果存在则直接返回,否则创建并返回。同时程序也可以向FlyweightFactory请求不被共享的对象。
【图解】
以纯文本为例,每个字符CharFlyweight为共享的轻量级对象,而由这些字符构成的行则为非共享的对象RowFlyweight,而TextFlyweightFactory则管理其共享对象的对象池。当用户向该工厂请求字符时,就从对象池中取得,而当用户向该工厂请求字符串时候则通过创建非共享的RowFlyweight获取,但此种每个字符的获取仍然向TextFlyweightFactory共享对象的对象池提出请求。
【程序】
【输出】
【State模式】
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。FSM有限状态自动机也是一个典型的状态模式,对输入有同的相应(状态转移),通常情况会写很多switch case 或者 if else语句,当状态数目很多时,维护一组swith case 很困难,状态逻辑和动作没能实现分开,在系统实现中,动作的实现代码直接写在状态逻辑中,使得系统的扩展性和维护性得不到保证。state模式也有问题是,状态逻辑分散到了很多state子类中,很难看到整个逻辑状态图,代码的维护难度也会加大。一般而言状态采用单例模式。注意单例模式中cpp文件中现代码,单例的初始化 GreenState* GreenState::_instance=0;必须在cpp文件中,在h文件中直接初始化或者不写编译会出问题。
【图解】
以交通灯的红灯和绿灯状态为例子(简单起见省略黄灯状态),交通灯(Context),红灯/绿灯状态(Concrete State,状态采用单例模式)
【程序】
RedState和GreenState类似,省略.....
【输出】
- [GoF设计模式]Flyweight模式和State模式的C++实现
- 笔记:Gof设计模式--Flyweight
- 笔记:Gof设计模式--State
- 常见设计模式解析和实现(C++)FlyWeight模式
- 常见设计模式解析和实现(C++)FlyWeight模式
- 常见设计模式的解析和实现(C++)之十三-FlyWeight模式
- 常见设计模式的解析和实现(C++)之十三-FlyWeight模式
- 常见设计模式的解析和实现(C++)之十三-FlyWeight模式
- 设计模式的解析和实现(C++)之十三-FlyWeight模式
- GOF 23设计模式之 享元模式(FlyWeight)
- GOF设计模式之STATE(状态)
- GoF的设计模式
- 设计模式flyweight的C++实现源码
- 常见设计模式的解析和实现(C++)之十七-State模式
- 常见设计模式的解析和实现(C++)之十七-State模式
- 常见设计模式的解析和实现(C++)之十七-State模式
- 设计模式的解析和实现(C++)之十七-State模式
- 设计模式 - Flyweight模式
- 面试常见问题
- 设计模式总结
- 开启XML之旅
- SQL注入
- 外企面试官们爱提的十个问题
- [GoF设计模式]Flyweight模式和State模式的C++实现
- UIView move animation
- zoj 3174
- sprintf与sscanf用法
- 知己知彼方可胜利
- Win32::Shortcut
- 浅谈SOA与Web Service
- struts中常用的标签
- DataTable2Excel无乱码(UTF8)