boost与设计模式

创建型模式

结构型模式

行为模式

创建型模式

模式抽象类类的实例化过程,封装了对象的创建过程----》使得对象的创建独立于其他部分。

工厂方法:  计算器

子类改变工厂方法的行为,生成不同的对象

工厂方法所属的类不一定是工厂类:

可以是:普通类+框架类+自由函数

例如make_shared(),make_tuple,

原型

类的实例通过拷贝的方式创建对象;具体的拷贝行为可以定制;

用法:为类实现一个clone()成员函数

拷贝构造和赋值操作符,部分实现原型模式

weak_ptr

weak_ptr的enable_shared_from_this类似一个原型模式;

创建了一个指向自身的shared_ptr

单件

单件模式保证类有且仅有一个实例,并提供一个全局的访问点。【通常的全局变量技术虽然可以提供类似功能,但不能防止创建多个实例】

单件实现原理:

class singleton:public boost::noncopyable

结构型模式

专注于:图和组合类或对象,形成更大更有用的新对象

组合对象的2种方式:

继承:编译期确定了对象的关系,无法在运行时改变,缺乏灵活性

运行时对象组合:不同对象间独立(通过接口通信),但较难理解

适配器:

包装原有对象,给出一个新的接口

array类 

原始数组--->符合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();

适配器模式:关心接口不匹配问题

桥接:侧重接口和实现,通常接口稳定,桥接解决实现的变化问题

智能指针的pimpl用法:

仅提供接口,不暴露内部实现

随机库random的硬件随机数发生器

random_deviec:对外接口不变,内部的pimpl指针可以有不同的实现

组合

将小对象--->树形结构,操作组合对象如同一个单个对象

定义了  部分-整体的结构

xpressive库的静态组合:

定义许多小的正则表达式元素----->大的正则表达式--->继续组合

multi_array

递归定义,每个维度都是一个multi_array

装饰   人穿衣服

运行时动态给对象添加功能

与适配器不同,没有改变对象的接口,只改变能力范围

operators库的基类链技术

用后一个运算概念装饰前一个,不断组合增加了操作符重载能力

编译期实现

外观

为大量对象提供一致的对外接口,

随机数库random的变量发生器

屏蔽random库内部大量细节,给用户一个生成随机数的operator()

享元

共享方式节约内存,

flyweight库:直接实现了享元模式

代理

控制对象,外界不能直接访问对象,必须通过代理

1、智能指针库

scoped_ptr,shared_ptr:包装了原始指针,

代理了原始指针的功能,需要原始指针时用智能指针代替

2、optional,ref,bind,function

包装原始的函数或对象,提供一定程度的控制,实际转发给原始的函数或对象完成工作。

3、array对C++内建的数组包装

boost缺少的

GUI库

COM+

日志库

数据库访问支持,

垃圾回收  boost的内存管理工具

  智能指针,pool,pointer container

XML解析库,property——tree的rapidxml暂解燃眉之急

高级网络通信协议库:

asio:可以使用socket,TCP/IP等手段编写网络程序,

但缺少高级网络协议,例如FTP,HTTP,SOAP等

行为模式

关注运行时对象的通信,通常对象一旦创建,它们就立刻联系起来,联系是动态的

大都采用对象组合,封装程序的可变部分。

职责链

请求的发送者和接受者解耦

assign库

使用重载操作符operator(),把赋值请求连接成一个链逐个处理,

最后完成赋值或初始化。

iostreams库

使用了职责链模式,定义了source,sink,filter概念,

对象间可以串联起来,一个的输出作为另一个的输入===》完成流处理

 命令

请求封装成一个对象;

不关心请求以何种方式处理;

exception库

错误信息 在异常机制传递,直到一个catch块处理它。

解释器

expressive,regex等库使用了解释器模式

前两者解析正则表达式

迭代器

按某种顺序访问集合中元素的方式封装在一个对象中,无须知道其内部表示

泛化的指针(STL中)

boost.iterators

中介者

大量需要通信的对象;

将这些对象解耦,只需与中介通信

备忘录

捕获对象的内部状态,

在对象外保存该状态;

把对象恢复到之前的保存状态

io_state_savers库

io_state_savers:实现类似备忘录模式、

保存I/O流的状态,在析构时自动恢复,防止I/O流因为状态异常发生错误。

观察者

signals

signals2

状态

   允许对象在状态变化时行为也同时变化;

  实例:状态改变时,根据状态的不同使用if_else,或switch执行不同的功能,

       缺点:类存在大量类似的分支语句,难以维护

 状态模式优点:消除分支语句,把状态处理分散到各个状态子类,每个子类处理一种状态。

boost.statechat实现了有限状态自动机,是状态模式的泛化。

策略  商场打折

函数对象

封装了各种操作,标准算法或其他类使用传入函数对象动态改变它的行为。

组件的模板类型参数

不同的模板类型,实例化的模板类内部的算法不同

模板方法

 父类定义操作的主要步骤,子类去实现

boost.test单元测试框架

只需依据test库的规则编写测试用例,

访问者

一个类有很多数据,造成接口非常庞大;

访问者模式:

分离类的内部元素和访问它们的操作;不同的访问者可以有不同类别的操作

可以增加新操作;

boost.variant的static_visitor

static_visitor实现了访问者模式,可以对很小的variant对象实施各种操作

如果variant对象变化,static_visitor也很容易适应变化

其他模式

空对象模式

充当哨兵

tuple的null_tyupe是空对象

表示空的tuple,什么也不做。

你可能感兴趣的:(boost与设计模式)