原文内容提领:本书第5章标题为泛化仿函数,我认为本章真正讲述的内容可以总结出一句话!如何利用C++老标准实现C++11新标准类似std::function提供的功能。std::function简介:分析std::function源码可知,std::function大量利用新标准的特性,变长参数模板,完美转发等。C++中可调用体:C++中的可调用体,现在可以补充一下1.C-like function2.C-like pointer to function3.reference to function4.function object5.pointer to mem...
Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。分为类适配器模式和对象适配器模式。系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。想使用一个已经存在的类,但如果它的接口...
模板方法模式在GOF的《设计模式:可复用面向对象软件的基础》一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的接口即可重定义改算法的某些特定步骤。我结合我在实际开发项目中的一个例子来说说这个模板方法模式吧。我们曾经做过一款产品,这个产品类似于一个云端的文件管理客户端。对于这样的一个客户端,由于其云端的服务器有三种,而每一种服务...
5.2 抽象工厂模式动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。 代码示例:实现利用数据库的业务逻辑,支持多数据库(Sql,Oracle等),有连接、命令、读取等功能。其中命令,连接功能之间有相互联系。方法一(使用工厂方法):每个功能类有一个创建的工厂,如IDBConnection与IDBConnectionFactory 1//数据库访问有关的基类 2class IDBConnection{3 ...
本次博文假设有一个Manager管理类,并以此为探究单例类的设计模式。一般作法类声明:class Manager{
public:
~Manager();//提供单例对象访问static Manager* getInstance();//删除单例对象void deleteInstance();void dosometing();private:
//构造函数声明为 保护方法Manager();//单例对象指针static Manager* s_Manager;
};类方法定义://单例对象指针初始化为nullptr,防止指向了未定义的数据
Manager* Manager::s_Manager = nu...
C++设计模式类库 Loki介绍与用法Loki是由Andrei编写的一个与《Modern C++ Design》(C++设计新思维)一书配套发行的C++代码库。它不仅把C++模板的功能发挥到了极致,而且把类似设计模式这样思想层面的东西通过库来提供。本篇文章介绍如何利用Loki来轻松地实现一些设计模式。由于Loki使用了大量牛X到爆的模板技巧,对编译器的要求是很苛刻的,官方兼容列表里只列出了VC7.1以上版本及GCC3.4以上版本。如果你象我一样喜欢用C++Builder...
1 #include <iostream>2 #include <vector>3 #include <algorithm>4 #include <iterator>5 #include <string>6 7usingnamespace std;8 9class STSubject;
1011//观察者12class STObserver
13{
14public:
15virtualvoid Update() = 0;
16};
1718class STConcreteObserverA: public STObserver
19{
20public:
21virtualvoid Update()
22 {
23 cout<< "ConcreteObserverA Get Subject: "<< endl;
24 }
...
动机(Motivation)在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?模式定义定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)...
#include <iostream>using namespace std;class Shape
{
public:virtual void draw()=0;
};class Rectangle:public Shape
{
public:void draw(){cout << "from rectangle"<<endl;}
};class Square:public Shape
{
public:void draw(){cout << "from square"<<endl;}
};class ShapeFatory
{
public:Shape* getShape(int a){if(a==0){return NULL;}else if(a==1){return new Rectangle();}else if(a==2){return new Square();}else{r...
组合(Composite)模式的其它翻译名称也很多,比如合成模式、树模式等等。在《设计模式》一书中给出的定义是:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
从定义中可以得到使用组合模式的环境为:在设计中想表示对象的“部分-整体”层次结构;希望用户忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象。
看下组合模式的组成。
1) 抽象构件...
一、UML图二、概念观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。三、说明角色:(1)Subject类:可以翻译为主题或者抽象通知者,一般用一个抽象类或者一个接口实现。他把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。(2)Obse...
5.2 抽象工厂模式动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。 代码示例:实现利用数据库的业务逻辑,支持多数据库(Sql,Oracle等),有连接、命令、读取等功能。其中命令,连接功能之间有相互联系。方法一(使用工厂方法):每个功能类有一个创建的工厂,如IDBConnection与IDBConnectionFactory 1 //数据库访问有关的基类2 class IDBConnection{3...
动机
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?模式定义
提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。
——《设计模式》GoF
结构
示例
设定一个数据库的访问模块cla...
一. 举例
这个样例是书上的,如果有一个公司的组结结构例如以下:
它的结构非常像一棵树,当中人力资源部和財务部是没有子结点的,详细公司才有子结点。
并且最关健的是,它的每一层结构非常相似。代码实现例如以下:#include <iostream>
#include <list>
#include <string>
using namespace std;
//公司类,提供接口
class Company
{
public: Company(string name) { m_name = name; } virtual ~Company() ...
1. 说说简单的函数回调首先说说一种简单的函数回调机制(一种通过获取对象的指针来进行函数的调用方法)以下是代码演示---这是观察者(被回调)部分:class Observer
{
public:// 抽象观察者的纯虚函数virtual void UpdateMessage() = 0;
};class ConcreteObserver : public Observer
{
public:// 实现抽象类的纯虚函数void UpdateMessage();
}void ConcreteObserver::UpdateMessage()
{// 这里实现详细的操作
}class Subject
{
publ...