创建型模式
结构型模式
行为模式
模式抽象类类的实例化过程,封装了对象的创建过程----》使得对象的创建独立于其他部分。
子类改变工厂方法的行为,生成不同的对象,
工厂方法所属的类不一定是工厂类:
可以是:普通类+框架类+自由函数
例如make_shared(),make_tuple,
类的实例通过拷贝的方式创建对象;具体的拷贝行为可以定制;
用法:为类实现一个clone()成员函数
拷贝构造和赋值操作符,部分实现原型模式
weak_ptr的enable_shared_from_this类似一个原型模式;
创建了一个指向自身的shared_ptr
单件模式保证类有且仅有一个实例,并提供一个全局的访问点。【通常的全局变量技术虽然可以提供类似功能,但不能防止创建多个实例】
单件实现原理:
class singleton:public boost::noncopyable
专注于:图和组合类或对象,形成更大更有用的新对象
组合对象的2种方式:
继承:编译期确定了对象的关系,无法在运行时改变,缺乏灵活性
运行时对象组合:不同对象间独立(通过接口通信),但较难理解
包装原有对象,给出一个新的接口
原始数组--->符合STL标准的容器
分离类的抽象和实现
1. shared_ptr实现的桥接模式
sample类,仅向外界暴露最小的细节,真正的实现在内部类impl,
class sample
{
private:
class impl;
shared_ptr<impl>p;
public:
sample();
void print();//外部接口
};
class sample::impl
{
public:
void print()
{cout<<"implprint";}
};
sample::sample():p(newimpl){}
voidsample::print(){ p->print();}
桥接模式的使用:
sample s;
s->print();
适配器模式:关心接口不匹配问题
桥接:侧重接口和实现,通常接口稳定,桥接解决实现的变化问题
仅提供接口,不暴露内部实现
random_deviec:对外接口不变,内部的pimpl指针可以有不同的实现
将小对象--->树形结构,操作组合对象如同一个单个对象
定义了 部分-整体的结构
定义许多小的正则表达式元素----->大的正则表达式--->继续组合
递归定义,每个维度都是一个multi_array
运行时动态给对象添加功能
与适配器不同,没有改变对象的接口,只改变能力范围
用后一个运算概念装饰前一个,不断组合增加了操作符重载能力
编译期实现
为大量对象提供一致的对外接口,
屏蔽random库内部大量细节,给用户一个生成随机数的operator()
共享方式节约内存,
flyweight库:直接实现了享元模式
控制对象,外界不能直接访问对象,必须通过代理
scoped_ptr,shared_ptr:包装了原始指针,
代理了原始指针的功能,需要原始指针时用智能指针代替
包装原始的函数或对象,提供一定程度的控制,实际转发给原始的函数或对象完成工作。
3、array对C++内建的数组包装
GUI库
COM+
日志库
数据库访问支持,
垃圾回收 boost的内存管理工具
智能指针,pool,pointer container
XML解析库,property——tree的rapidxml暂解燃眉之急
高级网络通信协议库:
asio:可以使用socket,TCP/IP等手段编写网络程序,
但缺少高级网络协议,例如FTP,HTTP,SOAP等
关注运行时对象的通信,通常对象一旦创建,它们就立刻联系起来,联系是动态的
大都采用对象组合,封装程序的可变部分。
请求的发送者和接受者解耦
使用重载操作符operator(),把赋值请求连接成一个链逐个处理,
最后完成赋值或初始化。
使用了职责链模式,定义了source,sink,filter概念,
对象间可以串联起来,一个的输出作为另一个的输入===》完成流处理
命令
请求封装成一个对象;
不关心请求以何种方式处理;
错误信息 在异常机制传递,直到一个catch块处理它。
expressive,regex等库使用了解释器模式
前两者解析正则表达式
按某种顺序访问集合中元素的方式封装在一个对象中,无须知道其内部表示
泛化的指针(STL中)
boost.iterators
大量需要通信的对象;
将这些对象解耦,只需与中介通信
捕获对象的内部状态,
在对象外保存该状态;
把对象恢复到之前的保存状态
io_state_savers:实现类似备忘录模式、
保存I/O流的状态,在析构时自动恢复,防止I/O流因为状态异常发生错误。
允许对象在状态变化时行为也同时变化;
实例:状态改变时,根据状态的不同使用if_else,或switch执行不同的功能,
缺点:类存在大量类似的分支语句,难以维护
状态模式优点:消除分支语句,把状态处理分散到各个状态子类,每个子类处理一种状态。
boost.statechat实现了有限状态自动机,是状态模式的泛化。
封装了各种操作,标准算法或其他类使用传入函数对象动态改变它的行为。
不同的模板类型,实例化的模板类内部的算法不同
父类定义操作的主要步骤,子类去实现
只需依据test库的规则编写测试用例,
一个类有很多数据,造成接口非常庞大;
访问者模式:
分离类的内部元素和访问它们的操作;不同的访问者可以有不同类别的操作
可以增加新操作;
static_visitor实现了访问者模式,可以对很小的variant对象实施各种操作
如果variant对象变化,static_visitor也很容易适应变化
表示空的tuple,什么也不做。