设计模式针对面向对象系统中重复出现的设计问题,提出了一个通用的设计方案,并予以系统化的命名和动机解释。
它描述了问题,解决方案,在什么条件下使用该解决方案极其效果。
设计模式有助于软件开发者更好更快地理解面向对象的精髓。设计出高内聚,结构良好,灵活健壮的程序。
分三种类型:1。创建型模式 2。结构型模式 3。行为型模式。
1。创建型模式:
抽象了类的实例化过程,封装了类的创建动作,使对象创建独立于系统其他部分。
1.1 抽象工厂(Abstract Factory)
把对象的创建封装在类中,通过派生子类的方式生产对象。
regex_compilerk可以通过模板技术产生各种正则表达式对象。
1.2生成器(Builder)
分解了复杂对象的创建过程。创建过程可以被子类改变,使同样的生产过程生产不同的对象。
multi_array
1.3工厂方法(Factory Method)
把对象的创建封装在一个方法中,子类可以改变工厂方法的生产行为生产不同的对象。
make_shared() make_tuple() make_optional()
1.4原型(Prototype)
类的实例通过拷贝的方式创建对象,拷贝行为可以制定。
weak_ptr的enable_shared_from_this
1.5单件(Singleton)
保证仅有一个实例。通过一个全局访问点。
pool库
2。结构型模式
如果组合类或对象进而形成更大更有用的新对象。
两种组合方式:
继承:编译期确定关系,缺乏灵活性。
运行时组合:通过接口通信,灵活易于模块化
2.1适配器(Adapter)
把一个类的接口转换为另一个接口,从而不改变原有代码的基础上复用原代码。
包装原有对象,再给一个新接口。
array
2.2桥接模式(Bridge)
分离了类的抽象和实现。解决实现的变化问题。
pimpl
2.3组合(Composite)
将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象。
property_tree multi_array xpressive
2.4装饰(Decorator)
运行时动态地给对象增加功能。比派生子类灵活。
operators库的基类链技术
2.5外观(Facade)
为大量对象提供一致接口。
random的变量发生器。屏蔽类内部细节,只提供operator()生成随机数
2.6享元(Flyweight)
通过共享的方式节约内存的使用。
配合工厂模式
xpressive库的regex_compiler 内部保存了所有正则表达式对象从而实现共享。
flyweight库直接俄实现了享元模式。
2.7代理(Proxy)
包装对象。外界不能直接访问。
smart_ptr库,optional ,ref, bind, function
3。行为模式
关注程序运行时的对象通信和职责分配,跟踪动态的,复杂的控制流和消息流。
3.1职责链(Chain of Responsibility)
把对象连成一条链,使链上每个对象都有机会处理请求。
把请求的发送者和接受者解耦,对象可以动态增减。
assign iostreams定义了source ,sink, filter
3.2命令(Command)
把请求封装成一个对象。
命令模式经常与责任链和组合一起使用:职责链处理命令模式封装的对象,组合模式把简单的命令组合成复杂的命令对象。
exception库,把错误包装在异常中,使用c++的异常机制传递,直到有一个catch处理。
3.3解释器(Interpreter)
定义一个类体系,用于实现语言的解释。
program_options
3.4迭代器(Iterator)
把按某种顺序访问一个集合中的元素的方式封装在一个对象中。无需知道集合内部的表示就可以访问集合。
boost.range, boost.iterators
3.5中介者(Mediator)
用中介对象封装了一系列对象的交互联系。
用于解耦,降低系统通信的复杂度。
呵呵,boost库暂时没有中介者模式例子。
3.6备忘录(Memento)
捕获对象的内部状态,并存在对象外,之后可以随时恢复。
io_state_savers库
3.7观察者(Observer)
定义了一对多的联系,当一个对象的状态变化时,所有与之有联系的观察者对象都会得到通知。
一个目标可以有多个观察者,一个观察者也可以观察多个目标。
java的Observer/Observable boost的singnals,singnals2
3.8状态(State)
状态变化时,行为同时改变。
boost.statechat实现了有限状态机。
3.9策略(Strategy)
封装了不同的算法,使他们在运行时可以互相替换。
3.10模板方法(Template Method)
父类定义主要步骤,但不实现,留给子类去实现。
boost.test
3.11访问者(Visitor)
分离了类的内部元素与访问他们的操作。
boost.variant ->static_visitor
4。其他模式
4.1空对象
定义了一个行为模式。扩展了空指针的涵义,给空指针一个默认的可接受的行为。
tuple -> null_type
4.2包装外观(Wrapper Facade)
包装底层API。
thread,interprocess, asio
4.3前摄器模式(Proactor)
用于异步调用的设计模式。
核心是前摄器,异步的操作处理器,异步的时间多路分离和完成时间队列,
可以不使用线程实现异步操作。
asio
总结:设计模式的目的是为了避免将来的重构!