随笔分类 - c++设计模式
摘要:概述:我们去银行柜台办业务,一般情况下会开几个个人业务柜台的,你去其中任何一个柜台办理都是可以的。我们的访问者模式可以很好付诸在这个场景中:对于银行柜 台来说,他们是不用变化的,就是说今天和明天提供个人业务的柜台是不需要有变化的。而我们作为访问者,今天来银行可能是取消费流水,明天来银行可能是去办 理手机银行业务,这些是我们访问者的操作,一直是在变化的。UML:抽象访问者(Visitor)角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作。抽象节点(Elem
阅读全文
摘要:职 责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 理它为止。其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量 在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成 了一条链,直到有一个对象处理请求。给出这个例子的UML图。#include #include using namespace std;class Manage
阅读全文
摘要:/************************************************************************//* 状态模式 *//************************************************************************/#include using namespace std;/* 一个状态接口,不同的状态从该接口中继承出来,想要增加新的状态 时,只需从此接口中派生出新...
阅读全文
摘要:备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态[DP]。举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续玩,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原来的状态。这就是备忘录模式。 给出备忘录模式的UML图,以保存游戏的存档为例。代码如下:#include #include #include using namespace std;class Memento{publi...
阅读全文
摘要:中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。中介者模式的例子很多,大到联合国安理会,小到房屋中介。下面以房屋中介来介绍中介者模式。#include #include using namespace std;class Mediator;class Person{public: virtual void setMediator(Mediator* mediator){}; virtual void sendMessage(string msg) = 0; virtual void g...
阅读全文
摘要:观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖 (Dependents),发布-订阅(Publish-Subsrcibe)。可以举个博客订阅的例子,当博主发表新文章的时候,即博主状态发生了改 变,那些订阅的读者就会收到通知,然后进行相应的动作,比如去看文章,或者收藏起来。博主与读者之间存在种一对多的依赖关系。下面给出相应的UML图设 计。以博客和博客的粉丝(observer)为例#include #include #include using namespace std;class Observer{p.
阅读全文
摘要:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。同时需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪 一项等统一接口。迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集 合内部的数据。代码如下:#include #include #include using namespace std;class Iterator{public: Iter...
阅读全文
摘要:命令模式的有点:1.能够容易地设计一个命令队列;2.在需要的情况下,可以比较容易地将命令记入日志。3.可以容易的实现对请求的撤销和重做。4.由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。#include #include using namespace std;class Reciever{public: void Action() { cout Action(); } ~Read_Command() { }private: Reciever *m_rev;};class Write_Command:publ...
阅读全文
摘要:举个围棋的例子,围棋的棋盘共有361格,即可放361个棋子。现在要实现一个围棋程 序,该怎么办呢?首先要考虑的是棋子棋盘的实现,可以定义一个棋子的类,成员变量包括棋子的颜色、形状、位置等信息,另外再定义一个棋盘的类,成员变量中 有个容器,用于存放棋子的对象。下面给出代码表示:棋子的定义,当然棋子的属性除了颜色和位置,还有其他的,这里略去。这两个属性足以说明问题。#include #include #include enum PieceColor {BLACK,WHITE};using namespace std;class Pos{public: Pos(int x,int y):m_x...
阅读全文
摘要:原文地址:http://www.cnblogs.com/jiese/p/3168844.html当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。用户不用关心到底是处理一个叶节点还是处理一个组合组件,也就用不着为定义组合二写一些选择判断语句了。组合模式让客户可以一致地使用组合结构和单个对象。抽象基类:1)Component:为组合中的对象声明接口,声明了类
阅读全文
摘要:装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类 更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是, 将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。#include #include using namespace std;class Phone{public: Phone() {} virtual ~Phone() {} virtual void Sh...
阅读全文
摘要:桥接模式的目的是分离抽象实现部分,把数据和实现分开,降低耦合。桥接模式和适配器模式不同之处是,桥接模式一般会在软件设计初考虑使用,适配器模式在软件设计之后为了实现接口兼容时使用。下面是系统和电脑之间的桥接模式的使用#include using namespace std;class OS{public: virtual void NameOS() { }};class WindowOS:public OS{public: void NameOS() { cout NameOS(); }};class ToshibaComputer:public...
阅读全文
摘要:当两个系统的接口不一样时,我们就要重新封装一下接口,以便于当前系统的调用。这种模式叫做适配器模式。适配器模式分为两种:1.对象组合适配器(Object Adapter)2.类适配器(Class Adapter)采用类继承的方式实现。下面是对象适配器的使用。#include #include using namespace std;class CCnOutlet{public: virtual ~CCnOutlet() { }; virtual void Cnplug() { //cout EnPlug(); }private: CEnOu...
阅读全文
摘要:原型模式是通过已经存在的对象的接口快速方便的创建新的对象。#include #include using namespace std;class Prototype{public: virtual Prototype *Clone() = 0; virtual void display() = 0;};class Prototype1:public Prototype{protected: string name; int id;public: Prototype1(string name, int id) { this->name = n...
阅读全文
摘要:假设我们有几个具有相似的窗体,都包含关闭窗体(closeButton)和按钮单击事件(ClickButton)我们在处理时,不想直接操作每个窗体,可以请求代理。#includeusing namespace std;class IWindow{public: IWindow(void) { } ~IWindow() { } virtual void CloseButton() = 0; virtual void ButtonClick() = 0;private:};class ProxyWindow:public IWindow{pub...
阅读全文
摘要:门面模式是比较常用的一种设计模式,我们可能在无意中就会使用,门面模式就是用一个门面类来处理子系统的复杂关系,门面类简单的Api接口供客户端调用。用一个简单的演播室来表示。#include using namespace std;//class Camera;//class Light;//class Screen;class Camera{public: Camera() { } ~Camera() { } void TrunOn() { cout TrunOn(); m_camera->Rotate(...
阅读全文
摘要:下面以女娲造黑人,白人,黄种人的例子来介绍一下工厂模式。1.工厂的接口,相当于造人工厂总部。class IHumanFactory{public: IHumanFactory(void) { } ~IHumanFactory(void) { } virtual IHuman* CreateHuman() = 0;};2.造人各个的部门class WhiteHumanFactory: public IHumanFactory{public: WhiteHumanFactory(void) { } ~WhiteHum...
阅读全文
摘要:别人的博客再讲策略模式时都会讲三国,策略类就是赵云的锦囊,锦囊里装着若干妙计。在打仗时想要用什么妙计,直接从锦囊里去取。锦囊类:class context{public: context(IStrategy *isstrategy); ~context(); void Operate(void);private: IStrategy *m_strategy; };context::context(IStrategy *isstrategy):m_strategy(isstrategy){}context::~context(){}void context::Operate(void){ ...
阅读全文

浙公网安备 33010602011771号