[GoF设计模式]Flyweight模式和State模式的C++实现

来源:互联网 发布:生死狙击矩阵怎么刷 编辑:程序博客网 时间:2024/06/10 17:39

【Flyweight模式】

 一个应用程序创建了太多的对象,会造成很大的存储开销,特别是大量轻量级的对象。对于这种情况,可以将对象的状态分成外部状态和内部状态,将可以被共享(不变化)的状态作为内部状态存储在对象中,而外部状态则可以将外部对象作为参数传递给对象。Flyweight有一个类似工厂模式的对象构造工厂,当程序需要一个对象时就会向FlyweightFactory发出请求对象的消息,该工厂拥有一个管理、存储对象的仓库(或者称为对象池),FlyweightFactory中会遍历对象池,如果存在则直接返回,否则创建并返回。同时程序也可以向FlyweightFactory请求不被共享的对象。

【图解】

以纯文本为例,每个字符CharFlyweight为共享的轻量级对象,而由这些字符构成的行则为非共享的对象RowFlyweight,而TextFlyweightFactory则管理其共享对象的对象池。当用户向该工厂请求字符时,就从对象池中取得,而当用户向该工厂请求字符串时候则通过创建非共享的RowFlyweight获取,但此种每个字符的获取仍然向TextFlyweightFactory共享对象的对象池提出请求。

1

 

【程序】

  

 

 

 

 

【输出】

2

 

 

【State模式】

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。FSM有限状态自动机也是一个典型的状态模式,对输入有同的相应(状态转移),通常情况会写很多switch case 或者 if else语句,当状态数目很多时,维护一组swith case 很困难,状态逻辑和动作没能实现分开,在系统实现中,动作的实现代码直接写在状态逻辑中,使得系统的扩展性和维护性得不到保证。state模式也有问题是,状态逻辑分散到了很多state子类中,很难看到整个逻辑状态图,代码的维护难度也会加大。一般而言状态采用单例模式。注意单例模式中cpp文件中现代码,单例的初始化 GreenState* GreenState::_instance=0;必须在cpp文件中,在h文件中直接初始化或者不写编译会出问题。

【图解】

以交通灯的红灯和绿灯状态为例子(简单起见省略黄灯状态),交通灯(Context),红灯/绿灯状态(Concrete State,状态采用单例模式)

2

 

【程序】

 

 

 

 

 

 

RedState和GreenState类似,省略.....

 

 

 

【输出】

1

原创粉丝点击