
设计模式
超频化石鱼
这个作者很懒,什么都没留下…
展开
-
单件模板
#ifndef __FILE_HELPER_H__#define __FILE_HELPER_H__class FileHelper{public: FileHelper(); ~FileHelper(); static FileHelper* getInstance(); static void releaseInstance();protected: stati原创 2018-02-02 08:39:41 · 184 阅读 · 0 评论 -
Iterator:迭代器模式
现在有一个集合。其内部元素的存储方式可能比较复杂。为了让用户在不用关心其内部表示的情况下对其元素进行访问,于是创建了一个迭代器用于对集合的各个元素进行访问。为了给用户提供一个更友好且强大的接口类,于是对迭代器以组合的形式进行封装,得到一个管理类。用户直接操作该管理类即可得到指定元素,或通过管理类直接得到迭代器,通过迭代器访问具体元素。这就是迭代器模式。 STL中使用了迭代器。以vec原创 2018-02-04 08:25:57 · 233 阅读 · 0 评论 -
Observer:观察者模式
很多用户的微信号都关注了腾讯官方的微信公众号。当有新的消息时,该公众号就会将信息推送给所有关注者。 这种情况下,用户微信号就是观察者,腾讯官方微信公众号就是被观察者。用户(观察者)有多个,而腾讯官方(被观察者)只有一个。 这就是观察者模式:每个观察者将自己注册给被观察者,当被观察者有新的信息时,就通知给所有的观察者。 cocos2dx的通知功能就使用了观察...原创 2018-02-04 08:25:58 · 280 阅读 · 0 评论 -
Memento:备忘录模式
所谓备忘录模式,就是由一个专门的备忘录类来对主体的状态进行保存。当主体处于某个状态时,主体可以生成一个备忘录类对象,主体的状态就保存在该对象中。然后将该备忘录对象保存在备忘录的管理类中;当主体状态改变后,若要恢复某个指定状态,调用备忘录的管理类来获取指定的备忘录类对象,然后根据该备忘录类对象来恢复状态。 例如,游戏当中,存档就是一个备忘录类对象。当玩家需要保存进度时,根据当前...原创 2018-02-04 08:25:59 · 229 阅读 · 0 评论 -
Proxy:代理模式
顾名思义,代理模式即在用户与工作类之间添加一个中间层,该中间层即代理类。用户与代理类进行交互,代理类再与工作类进行交互。从而达到用户间接控制工作类的情况。 类似于需要某个明星做某件事,那么直接联系其代理人,代理人会将请求传达给明星,然后明星再做这件事。 这也意味着,中间层可能有否决权,即该请求交给代理人后,代理人并不一定会传达给明星。 总之,当直接访问一个原创 2018-02-04 08:26:02 · 201 阅读 · 0 评论 -
Singleton:单件模式
Singleton:单件模式单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法(根据实际情况,可能需要几个类实例)。在某些情况下,这种程序设计方法是很有用处的。例如://.h文件class FileHelper{private: FileHelper() {}; FileHelper(const FileHelper原创 2018-02-04 08:26:16 · 238 阅读 · 0 评论 -
Prototype:原型模式
Prototype:原型模式所谓原型模式,就是可以根据一个原型,快速创建出其拷贝。如:int a = 1;int* b = new int(a);a++;cout << a << endl;cout 输出结果: 2 1上面就使用了原型模式。根据原型a,快速创建出了a的拷贝b。同时,b保存了a当时的状态。当a之后进行了修改,根据b,就可以得知当时a原创 2018-02-04 08:26:03 · 238 阅读 · 0 评论 -
State:状态模式
某个对象有一个标准接口。同时,该对象可能处于各种状态下。当该对象处于不同状态下时,客户调用标准接口,该对象会产生不同的响应。 即允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。这就是状态模式。 例如,电灯开关这个对象提供了一个标准接口:按下开关。而开关可能处于关闭/打开这两种状态。当开关处于关闭状态时,调用标准接口按下开关,电灯会被打开;当开关原创 2018-02-05 08:24:21 · 292 阅读 · 0 评论 -
Template Method:模板方法模式
模板方法模式即提供一个抽象基类作为模板类,用户直接使用此模板类。标准模板类可以被任意派生模板类代替。于是用户每次需要不同的处理方式时,仅需要更换派生模板,而不需要对模板的调用做任何修改。 1. 抽象模板类定义抽象模板类规定了对外的标准接口及派生类需要实现的抽象接口。对于用户而言,只需要使用标准接口。 //抽象模板class AbstractClass...原创 2018-02-05 08:24:26 · 234 阅读 · 0 评论 -
Strategy:策略模式
需要令某个模块(上下文)执行一个功能,但是该模块可以配置不同的算法,在不同的算法下,执行的结果也不同。 这里,算法就是策略。策略模式就是在运行时可以进行策略的更改,从而影响到执行的结果。 1. 定义策略类基类及派生类策略类基类定义了策略类的标准接口。策略类派生类实现了策略类的标准接口。策略类提供的标准接口一般是某个与Context无关的独立功能模块,比如算法原创 2018-02-05 08:24:26 · 276 阅读 · 0 评论 -
Mediator:中介者模式
Mediator:中介者模式 新创建了一个QQ账号,还没有加任何好友。现在需要将一条信息发送给n个人。那么需要两个步骤:① 将所有需要接收信息的人加为好友② 依次给这些人发送信息这样非常繁琐。于是,考虑使用一个中介者,即QQ群。无需加任何好友,直接在群里发送一条信息,那么所有其他群成员都会收到。这就是中介者模式。所谓中介者,就是负责将一个成员发来的信息发送给另原创 2018-02-04 08:25:56 · 260 阅读 · 0 评论 -
Interpreter:解释器模式
解释器模式通常用于语法分析。 如果一些重复出现的问题可以用一种简单的语言来进行表达,那么就可以使用解释器模式。 解释器模式易于改变和扩展文法。易于实现一个简单的语言。 但解释器模式的效率并不高。 解释器模式的维护也非常困难。 因此,尽量不要在重要模块中使用解释器模式。在项目中,可以使用脚本语言代替解释器模式。原创 2018-02-04 08:25:52 · 217 阅读 · 0 评论 -
Factory:工厂模式
工厂模式有3种。以下的示例代码都省略了构造函数与析构函数。一. 简单工厂模式简单工厂模式就是只有一个工厂,所有的产品都有该工厂生产。每一种产品都有一个对应的type。当需要某种产品时,将该产品的type传给工厂,然后工厂即会返回该产品。这样意味着工厂内部必须针对type作判断,也就是使用一个switch语句来根据传入的type,决定创建哪一种产品。当产品种类很多时,这个sw原创 2018-02-04 08:25:45 · 211 阅读 · 0 评论 -
Bridge:桥接模式
将抽象部分与它的实现分离,使他们都可以独立地变化。 抽象与实现的分离方法,是借助耦合。对于一个派生类而言,其从基类继承了抽象函数,并对抽象函数进行实现,这是常规的抽象与实现耦合的情况。而,若将函数实现的功能代码抽出,放到一个特定的实现类里,并将该类对象作为派生类的成员变量。当派生类对继承的抽象函数进行实现时,就可以调用实现类对象的接口函数,从而实现了相同的效果。如:原创 2018-02-03 08:35:26 · 218 阅读 · 0 评论 -
Chain of Responsibility:责任链模式
现有多个处理者。这些处理者可以处理不同的请求。这些处理者有等级关系,每个处理者都有更上级的处理者。对于最上级的处理者,可以没有上级。对于一个上级处理者,可以有多个下级处理者。客户端发出了一个请求,请求被传递给一个最下级处理者。而该处理者无法处理该请求,于是将该请求发送给自己的上级。上级的处理者无法处理该请求,于是将该请求再度发往自己的上级……直到有某个处理者可以处理该请求。如果请求发送给最上级原创 2018-02-03 08:43:34 · 206 阅读 · 0 评论 -
Builder:建造者模式
Builder模式与工厂模式非常相似,但是侧重点不同。Builder多了一个Director类。工厂模式生产的产品并不注重装配顺序,其侧重点在于创建。Builder模式的产品必须有固定的装配流程,其侧重点在于流程。对于某些产品,若装配流程不同,会导致最终的产品不同,那么就需要采用Builder模式。对于简单产品而言,使用工厂模式非常合适;对于复杂产品而言,Builder模式是非常合原创 2018-02-03 08:43:34 · 165 阅读 · 0 评论 -
Commond:命令模式
命令模式即将请求封装为对象Commond。执行者可以执行多个操作,即执行者才是操作真正的实现者。设其为操作0-9。每个操作都封装了一个对应的Commond类。当该Commond被调用时,Commond会令执行者执行其对应的操作。用户需要执行者执行某个操作序列。比如这个序列为06131109,共8个操作。那么用户创建8个Commond对象,然后将这8个Commond对象依次交给一个调用者In原创 2018-02-03 08:43:36 · 1458 阅读 · 0 评论 -
Composite:组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。处理树中的每个节点时,其实不用考虑他是叶子节点还是根节点。即模糊了简单元素和复杂元素的概念,客户端可以像处理简单元素一样来处理复杂元素。或者说,复杂元素也是一种简单元素,处理简单元素与复杂元素的操作是一致的。这类似于cocos中的Node及其派生类。例如,三角形,正方形,圆形,这都原创 2018-02-03 08:43:39 · 208 阅读 · 0 评论 -
Dectorator:装饰模式
要为一个类扩展功能,那么可以使用派生,然后由派生类实现扩展的功能。 但,若扩展的是个临时功能,或者可能扩展多个不确定功能,就需要使用装饰模式。装饰模式允许为一个类临时添加任意其他功能,并可以任意组合。 装饰模式可以在不生成子类的情况下为对象添加职责。 1. 定义Component类该类是被装饰类与装饰类的共同基类。该类规定了被装饰类的操作接口。原创 2018-02-03 08:43:42 · 232 阅读 · 0 评论 -
Facade:外观模式
外观模式就是将子系统交给一个中间层Facade来进行管理,用户直接调用Facade的接口。 一般来说,如果功能较多,那么需要对功能模块进行单独实现,即实现子系统。然后对用户而言,需要对每个子系统进行直接的调用。 这样所产生的一个问题是,一旦某个子系统进行了接口的修改,那么用户对子系统的调用都需要修改。 如果使用Façade模式,对子系统的调用交给Facade类,用户只原创 2018-02-03 08:43:47 · 155 阅读 · 0 评论 -
Adapter:适配器模式
Adapter模式用于令接口不兼容的类可以一起工作。Adapter本身用于适配这些不兼容的类。如,现在有一个需求,需要使用标准类接口。而现有类功能可以实现,但是接口并非标准。于是,可以使用一个Adapter,将现有类的接口转换为标准接口,从而使得原本不兼容的类兼容。 1. 目标接口类,即客户需要的接口class Target{public: virtual void R原创 2018-02-03 08:35:25 · 188 阅读 · 0 评论 -
Flyweight:享元模式
享元模式可以避免大量且相似的开销。 例如,停车场中有1000辆车,那么需要创建1000个对象。这样开销是非常大的。 设这1000辆车中,Tesla有300辆,BMW有700辆。以Tesla为例,300辆Tesla的基本属性都相同,仅仅是颜色不同,那么就考虑创建一个Tesla基础对象,然后300辆Tesla共享这一个对象,仅根据颜色不同进行各自的处理。如,1号停车原创 2018-02-04 08:25:45 · 239 阅读 · 0 评论 -
Visitor:访问者模式
已经定义了一个元素类,该类有一些成员变量。 现在希望增加一个对该类的操作。常规方法是进行派生,然后添加一个成员函数。但是这样意味着每增加一个操作,都要进行一次派生。这样随着操作数量的增加,该元素类的派生类会非常多。 于是考虑令该元素类本身固定不变,每增加一个操作,就创建一个类(访问者),该访问者类封装了对元素类的操作。当需要执行操作时,就令访问者类对象对元素类进行访问即原创 2018-02-05 08:24:28 · 195 阅读 · 0 评论