再看设计模式——命令模式

命令模式Command本质就是一个对象化的回调函数。 通常命令的发送者和命令执行者有不同的生命周期,这也是回调函数经常会面临的问题,因此才需要设计这个模式来解耦。这个模式可以跟策略模式或状态模式一起用来保证状态和行为的可扩展性。 C++可以使用仿函数来实现命令模式 命令发送了并不是立即执行,通常会加入一个undo方法来支持撤销命令。

再看设计模式——访问者模式

首先我们拥有一个由许多对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应;在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方法中回调访问者的visit方法。 访问者模式使得我们可以在传统的单分派语言(如Jav …

阅读全文

c++11如何封装thread库

基本接口要求 要求std::thread的构造函数 但是OS的库函数定义为: 主要是接口中的entry,本身使用void*根本没带类型信息,难点在于要做到模板暴露出类型从而可以通用化 第一个问题:把f和args统统打包在一起做成一个void *结构 我们得从void* 中获取函数指针和参数指针,首先来个结构体定义真实指针类型 需要一个tuple,用于保存f和args,这样我们就可以通过将void …

阅读全文

再看设计模式——中介者模式与观察者模式

观察者模式(Observer)是典型的订阅发布,是event机制的常见实现模式,MVC中的M和V之间的数据流订阅变动就靠这个模式实现。有push推模型(通知所有可能的事件处理)和pull拉模型(感兴趣的事件处理自己获取)两种实现(java中有java.util.Observer接口可以参考)。 这个实现的问题是event机制是同步的,并没有异步化。另一个问题是事件处理的顺序。 中介者模式(Medi …

阅读全文

看设计模式——模板方法与策略模式

模板方法模式(Template Method)和策略模式都是用来解决通用算法和使用的上下文环境分离的代码抽象问题,前者思路是靠继承,后者则靠委托。 模板方法模式很简单,就是提供一些可以用来继承覆盖的通用方法,然后在上下文环境中提前调用通用这些方法,类似做stub。派生类继承后可以改写通用方法,从而完成更多具体的算法实现。缺点是导致派生类里面的具体算法实现和基类无形中绑定了。 策略模式相对复杂一些, …

阅读全文