![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
tracycw
talk is cheap, show me the code
展开
-
1.单例模式
设计模式:单例模式 #include <iostream> using namespace std; // 单例模式:懒汉式和饿汉式 // 懒汉式 class SingletonLazy { private: SingletonLazy() {}; // 私有构造函数,外部不能知道new对象 public: static Single原创 2019-02-28 11:40:41 · 107 阅读 · 0 评论 -
5.模版方法模式
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 #include <iostream> using namespace std; // Builder(建造工厂) class Builder { public: virtual void build...原创 2019-03-04 10:05:54 · 381 阅读 · 0 评论 -
6.建造者模式
建造者模式的优缺点 优点: 1、降低代码耦合度。在建造者模式中,客户端不需要知道产品内部是如何实现的,我们只需得到产品的对象。并且使用导演者和建造者分离组装过程和组件具体构造过程,具有灵活的扩展性。 2、优秀的扩展性。具体建造者相互独立,方便扩展,符合开闭原则。 缺点: 一定的使用范围限制。建造者模式的产品的组件基本相同,如果产品的差异性较大,建造者模式就不适用了。 比较 ...原创 2019-03-04 10:09:11 · 523 阅读 · 0 评论 -
7.外观模式
外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构。 #include <iostream> using namespace std; ...原创 2019-03-04 10:57:27 · 384 阅读 · 2 评论 -
8.策略模式
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。 #include <iostream> using namespace std; // 排序算法抽象类 class Abstr...原创 2019-03-04 11:11:29 · 330 阅读 · 0 评论 -
9.适配器模式
适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 对象适配: 类适配: #include <iostream> using namespace std; // 俩孔插座 class SocketWithTwoHole { public: virtual v...原创 2019-03-04 11:58:25 · 312 阅读 · 0 评论 -
10.代理模式
定义:为其他对象提供一种代理以控制对这个对象的访问。 #include <iostream> using namespace std; // 租房抽象类 class Renter { public: virtual void rent_house() = 0; }; // 具体租客:ZhangSan class ZhangSan : publ...原创 2019-03-04 14:25:05 · 287 阅读 · 0 评论 -
11.中介者模式
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 #include <iostream> #include <string> using namespace std; class Mediator; class Person { public: vi...原创 2019-03-04 15:10:03 · 295 阅读 · 0 评论 -
12.装饰模式
装饰模式:动态地给一个对象添加一些额外的职责 一般情况下可用继承实现类的功能拓展 #include <iostream> using namespace std; // 英雄抽象类 class AbstractHero { public: virtual void show_status() = 0; public: int m_Hp; ...原创 2019-03-04 15:44:06 · 321 阅读 · 0 评论 -
13.桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立地变化。 #include <iostream> using namespace std; // video抽象类 class Video { public: virtual void play_video() = 0; }; // mpeg class MPEG : public Video { publi...原创 2019-03-04 16:04:26 · 334 阅读 · 0 评论 -
14.享元模式
想想我们编辑文档用的office,文档里文字很多都是重复的,我们不可能为每一个出现的汉字都创建独立的空间,这样代价太大,最好的办法就是共享其中相同的部分,使得需要创建的对象降到最小,这个就是享元模式的核心,即运用共享技术有效地支持大量细粒度的对象。 享元对象能做到共享的关键是区分内蕴状态(InternalState)和外蕴状态(ExternalState)。 内蕴状态是存储在享...原创 2019-03-04 17:31:13 · 275 阅读 · 0 评论 -
15.观察者模式
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 #include <iostream> #include <list> using namespace std; // 抽象英雄类(观察者) class AbstractHero { public: virtual v...原创 2019-03-05 09:16:32 · 239 阅读 · 0 评论 -
22.组合模式
将对象组合成树形结构以表示"部分-整体"的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。 #include <iostream> #include <string> #include <list> using namespace std; // 抽象类: 公司 class Company { public: Company(string...原创 2019-03-05 16:47:16 · 223 阅读 · 0 评论 -
2.简单工厂模式
考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等), 这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂...原创 2019-02-28 18:01:33 · 164 阅读 · 0 评论 -
3.工厂方法模式
简单工厂方法不符合开闭原则,增加按钮功能需要修改工厂类。 现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮、矩形按钮、菱形按钮等,它们实现在抽象按钮工厂类中定义的方法。这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需...原创 2019-02-28 18:15:42 · 119 阅读 · 0 评论 -
4.抽象工厂模式
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。 为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视...原创 2019-03-01 15:04:10 · 187 阅读 · 0 评论 -
16.命令模式
我们去烧烤摊吃烧烤,我们是通过服务员来点菜,具体是谁来做和他们什么时候完成,其实我们都不知道。抽象之,“菜单请求者”我们和“菜单实现者”烧烤师傅,2者之间是松耦合的,我们对这些菜的其他一些请求比如“撤销,重做”等,我们也不知道是谁在做。其实这就是本文要说的Command模式。 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作...原创 2019-03-05 10:13:00 · 243 阅读 · 0 评论 -
17.状态模式
状态模式:允许一个对象在其内部状态改变时改变它的行为。 对象看起来似乎修改了它的类。 它有两种使用情况: (1)一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。 (2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。 案例:英雄联盟杰斯切换形态攻击 #include <iostream> using n...原创 2019-03-05 16:38:54 · 242 阅读 · 0 评论 -
18.责任链模式
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 案例:员工加薪,一级一级往上申请。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。 #include <iostream> #include <stri...原创 2019-03-05 16:41:05 · 189 阅读 · 0 评论 -
19.原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。 #include <iostream> using namespace std; class Resume { public: Resume() {} ~Resume() {} virtual Resume* clone() = 0; virt...原创 2019-03-05 16:42:09 · 226 阅读 · 0 评论 -
20.访问者模式
表示一个作用于某对象结构的各元素的操作。它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作 案例:假设你的电脑(Element)坏了,找售后,售后告诉你需要拆机检测,检测过程由两个技术人员(Visitor)依次负责不同功能的检测。电脑的部件是固定的,不会有太大的改变,但是如果一种检测方式没有找出问题的话,那么就需要增加检测项。符合访问者模式的特点。 #include <...原创 2019-03-05 16:43:37 · 201 阅读 · 0 评论 -
21.备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 #include <iostream> #include <vector> using namespace std; // 需要保存的信息 class Memento { public: Memento(int hp, int at, int df) : m_Hp(hp), m_At(...原创 2019-03-05 16:46:19 · 206 阅读 · 0 评论 -
24.解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 案例:简谱到音乐的转译(音乐简谱中描绘乐曲用的是1234567,而实际发出的声音却是"哆瑞咪发嗦啦西")。 #include <iostream> #include <string> #include <vector> #include <ss...原创 2019-03-06 14:25:06 · 169 阅读 · 0 评论 -
23.迭代器模式
定义:提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。 1、迭代器角色(Iteractor): 负责定义访问和遍历元素的接口 2、具体迭代器角色(Concrete Iteractor): 实现迭代器接口,并要记录遍历中的当前位置 3、集合角色(Aggregate): 负责提供创建具体迭代器角色的接口 4、具体集合角色(Concrete Aggregat...原创 2019-03-06 14:23:55 · 176 阅读 · 0 评论