
设计模式
努力是不想被淘汰
努力、学习
展开
-
设计模式-迭代器模式
迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。该模式很好理解,C++中的迭代器应该都用过,和那个差不多。迭代器模式的UML类图:1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。3.集合角色(Aggregate)...原创 2019-12-22 11:58:21 · 105 阅读 · 0 评论 -
设计模式-解释器模式
解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。使用场景: 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。 2、一些重复出现的问题可以用...原创 2019-12-21 19:55:51 · 119 阅读 · 0 评论 -
设计模式-状态模式(C++)
状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了类本身。状态模式主要解决的时当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式是一种对象行为型模式。状态模式的UML类图:环境类(Context): 定义...原创 2019-12-21 19:42:22 · 132 阅读 · 0 评论 -
设计模式-访问者模式(C++实现)
访问者模式:分离对象的数据和行为,可以不修改已有类的情况下,增加新的操作角色和职责。表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间耦合解脱开,使得操作几何可以相对自由地演化。访问者模式的目的使要把处理从数据结构中分离出来。很多系统可以按照算法和数据结构分开,如果这...原创 2019-12-21 17:21:43 · 183 阅读 · 0 评论 -
设计模式-备忘录模式
备忘录模式:在不破坏分装性的前提下,保存对象的内部状态,并且在这个状态之外保存这个状态,这样可以以后恢复到这个状态。备忘录模式的UML类图:Memento:备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者只能看到备忘录的窄接口————它只能将备忘录传递给其他对象。相反,原发器能够看到一个宽接口...原创 2019-12-16 18:09:48 · 93 阅读 · 0 评论 -
设计模式-观察者模式
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。可以举个博客订阅的例子,当博主发表新文章的时候,即博主状态发生了改变,那些订阅的读者就会收到通知,然后进行相应的动作,比如去看文章,或者收藏起来。博主与读者之间存在种一对多的依赖关系。观...原创 2019-12-03 11:09:50 · 110 阅读 · 0 评论 -
设计模式-中介者模式
中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。该模式很好理解。中介者模式的UML类图:#include<iostream>using namespace std;class Mediator;//抽象人class Person{protected: Mediator ...原创 2019-12-03 10:11:06 · 100 阅读 · 0 评论 -
设计模式-策略模式
策略模式定义算法家族,分别封装。它们之间可以相互替换,让算法变化,不会影响到用户。优点:适合类中的成员方法为主,算法经常变动;简单了单元测试(因为每个算法都有自己的类,可以通过自己的接口单独测试)。缺点:客户端需要做出判断。策略模式的UML类图:#include <iostream>using namespace std;class Strategy//策略抽象类,定义所有...原创 2019-11-29 20:12:46 · 94 阅读 · 0 评论 -
设计模式-责任链模式
避免请求发送者和接受者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条连传递请求,直到有对象处理它为止。责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。优点:1.降低耦合度,它将请求的发送者和接受者解耦2.简化了对象,使得对象不需要知道链的结构3.增强给...原创 2019-11-17 19:49:44 · 101 阅读 · 0 评论 -
设计模式-命令模式
命令模式是将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。其UML类图如下:#include <iostream>#include <vector>#include <algorithm>using namespace std;// 烤肉师傅class doctor{publi...原创 2019-11-17 18:50:06 · 102 阅读 · 0 评论 -
设计模式-模板方法模式
模板方法模式在抽象类中统一操作步骤,并规定好接口,让子类实现接口。这样可以把各个具体和操作步骤解耦合。模板方法模式又叫模板模式(Template Pattern),一个抽象类公开定义了执行它的方法的方式或者模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。(即模板方法模式定义一个操作中的基本骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构就可以重定义该算法...原创 2019-11-17 18:11:35 · 101 阅读 · 0 评论 -
设计模式-享元模式
客户端利用享元工厂生产具体的享元对象。享元工厂实例的对象只有一份,节省内存,当对象的key相同时,会复用对象。以共享的方式高效的支持大量的细粒度的对象UML类图...原创 2019-11-17 14:22:40 · 91 阅读 · 0 评论 -
设计模式-外观模式
外观模式:为一组具有类似功能的类群,提供一个一致的简单界面。为子系统统一一套接口,让子系统更加容易使用。外观模式UML类图:Facade:外观类,知道哪些子系统类负责处理请求,将客户端的请求代理给适当的子系统对象。Subsystem:子系统类,实现子系统的功能,处理外观类指派的任务,注意子系统类不含有外观类的引用。#include <iostream>using names...原创 2019-11-10 21:54:28 · 96 阅读 · 0 评论 -
设计模式-组合模式
组合模式:单个对象和组合对象的使用具有一致性。将对象组合成树形结构以表示“部分-整体”。组合模式UML类图#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;class ComponentPtr{p...原创 2019-11-10 21:10:51 · 90 阅读 · 0 评论 -
设计模式-桥接模式
桥接模式是将抽象部分与实现部分分离(解耦合),使他们都可以独立的变化。桥接模式(Bridge)是一种结构型设计模式。Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。桥接模式的UML类图:#inclu...原创 2019-11-10 17:03:13 · 95 阅读 · 0 评论 -
设计模式-装饰模式
装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活,有时我们希望给某个对象而不是整个类添加一些功能。适用性:1、在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责。2、处理那些可以撤销的职责。3、希望为某个对象而不是一整个类添加一些功能时。4、当不能采用生成子类的方法进行扩充时(ps添加类功能的方法有三种:1、直接修改类 2、利用继承在...原创 2019-11-05 13:40:52 · 108 阅读 · 0 评论 -
设计模式-代理模式
代理模式也称为委托模式。作用就是找一个对象来替我们访问某个对象。意图:为其他对象提供一种代理以控制对这个对象的访问。UML类图:#include <iostream>using namespace std;class Image{public: Image(string name): m_imageName(name) {} virtual void S...原创 2019-10-27 15:01:52 · 93 阅读 · 0 评论 -
设计模式-适配器模式
适配器模式,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要解决的是数据和行为都正确,但接口不符合的情况。该模式很好理解,其UML图如下:Target:定义Client使用的与特定领域相关的接口。Client:与符合Target接口的对象协同。即是Target的使用场景。Adaptee:定义一个已经存...原创 2019-10-27 14:16:18 · 102 阅读 · 0 评论 -
设计模式-建造者模式
一个对象的建造比较复杂,将一个对象的建造和表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是 适合建造具体细节的产品的设计模式建造模式的UML类图#include <iostream>#include <vector>#include <string>using namespace std;// 产品类class Product...原创 2019-10-24 00:01:39 · 101 阅读 · 0 评论 -
设计模式-原型模式
原型模式是用原型实例指定创建兑现的种类,并且通过拷贝这些原型创建新的对象。原型模式说白了其实就是有一个把自己拷贝一下的方法。该模式很好理解,该模式独特地方不是类与类之间的关系,更多的是从语义上理解,只是实现了一个接口而已。一个复杂对象,具有自我复制的功能,同意一套接口UML类图#include <iostream>using namespace std;class pro...原创 2019-10-20 14:34:33 · 100 阅读 · 0 评论 -
设计模式-单例模式(饿汉式)
#include <iostream>using namespace std;class Singelton{protected: Singelton(){}private: static Singelton* instance;//static的,类一加载,就会初始化public: static Singelton* getInstance(){...原创 2019-10-16 22:35:11 · 161 阅读 · 0 评论 -
设计模式-单例模式(懒汉式)
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。使用单例模式可以保证一个类只生成一个对象实例,即在整个程序的生命周期内,该类的实例对象只存在一个。单例模式特点:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一...原创 2019-10-15 23:06:08 · 784 阅读 · 0 评论 -
设计模式-抽象工厂模式
工厂模式和简单工厂模式要求产品子类必须要是同一类型的,拥有共同的方法,这就限制了产品子类的扩展。于是为了更加方便的扩展,抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,我们可以把他们一起视作一组,然后好几组产品构成一族。抽象工厂模式的UML类图#include <iostream>using namespace std;//单核接口类class Sing...原创 2019-09-27 17:16:23 · 104 阅读 · 0 评论 -
设计模式-工厂方法模式
在简单工厂方法中,每次添加一个产品子类都必须在工厂类中添加一个判断分支,这样违背了开放-封闭原则,因此,工厂方法模式就是为了解决这个问题而产生的。既然每次都要判断,那就把这些判断都生成一个工厂子类,这样,每次添加产品子类的时候,只需再添加一个工厂子类就可以了。这样就完美的遵循了开放-封闭原则。但这其实也有问题,如果产品数量足够多,要维护的量就会增加,好在一般工厂子类只用来生成产品类,只要产品子类...原创 2019-09-26 16:31:38 · 109 阅读 · 0 评论 -
设计模式-简单工厂模式
工厂模式属于创建型模式,大致可以分为三类:简单工厂模式、工厂方法模式、抽象工厂模式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。首先介绍的是简单工厂模式:class SingleCore { public: virtual void Show() = 0;}; //单核A class SingleCore...原创 2019-09-23 23:09:54 · 94 阅读 · 0 评论