1.主要思想:例如针对不同的算法,创建不同的类。#include <iostream>
usingnamespace std;// The abstract strategyclass Strategy
{
public:virtualvoid AlgorithmInterface() = 0;
};class ConcreteStrategyA : public Strategy
{
public:void AlgorithmInterface(){cout<<"I am from ConcreteStrategyA."<<endl;}
};class ConcreteStrategyB : public Strategy
{
public:void AlgorithmInterface(){cout<<"I am from ConcreteS...
结构型模式11)外观模式本文参考了https://www.cnblogs.com/adamjwh/p/9048594.html外观模式主要用来为一个复杂的模块或子系统提供一个外界访问的接口。这样使得子系统相对独立,外界对子系统的访问只要黑箱操作即可。
外观模式一般包含两个角色:
一个内层系统类,抽象类。
另一个是外观类,一般不是抽象类。比如电脑开机的过程。电脑开机实际上包含了很复杂的过程,包括Cpu,Gpu,内存等设备的开机过程。
但是作为用户来说,只需...
关于C++单例模式下m_pinstance指向空间销毁问题,m_pInstance的手动销毁经常是一个头痛的问题,内存和资源泄露也是屡见不鲜,能否有一个方法,让实例自动释放。解决方法就是定义一个内部垃圾回收类,并且在Singleton中定义一个此类的静态成员。程序结束时,系统会自动析构此静态成员,此时,在此类的析构函数中析构Singleton实例,就可以实现m_pInstance的自动释放。附上测试代码650) this.width=650;" src="/upload/getfiles/defa...
一、UML图二、概念 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。三、说明什么时候用?(1)当你需要访问一个聚集对象,而且不管这些对象时什么都需要遍历的时候,你就应该考虑用迭代器模式。(2)你需要对聚集有多种遍历时,可以考虑用迭代器模式。(3)为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。迭代器模式的好处?迭代器模式就是分离了...
19.1.解释概念:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。main(),客户CLiftState,电梯状态抽象类CCloseingState,电梯门关闭COpenningState,电梯门打开CRunningState,电梯运行CStoppingState,电梯停止CContext,电梯的控制面板说明:CContext保持电梯的状态,并提供操作的接口函数。当函数被调用时,CContext直接调用当前状态的相应函数。由状态的接口函数来确定是否可以执行这个动作,以及...
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系
统在不修改具体工厂角色的情况下引进新的产品。这个例子更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。贴代码了。5.1.解释main(),女娲IHuman,产品接口CYellowHuman...
原文内容提领:本书第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 ...
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) 抽象构件...