
设计模式--学习笔记
仅作为个人学习笔记使用,会大量使用学习网站和书上的内容和代码
不闻窗外事
学无止境
展开
-
桥接模式--结构型模式
1、描述桥接是一种结构型模式,可将业务逻辑或一个大类拆分成为不同的层次结构,从而能独立的进行开发。层次结构中的第一层(通常称为抽象部分)将包含对第二层(实现部分)对象的引用。抽象部分能将一些(有时是绝大部分)对自己的调用委派给实现部分的对象。所有的实现部分都有一个通用接口,因此他们能在抽象部分内部相互替换。2、结构图Abstraction:提供高层控制逻辑,依赖于完成底层实际工作的实现对像 Implementation:为所有具体实现声明通用接口。抽象部分仅能通过在这里声明的方法与实现原创 2020-11-25 08:37:15 · 284 阅读 · 0 评论 -
享元模式--结构型模式
1、描述2、结构图3、C++代码原创 2020-11-24 18:11:08 · 251 阅读 · 0 评论 -
状态模式--行为模式
1、描述状态是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为。该模式将与状态相关的行为抽取到独立的状态类中,让原对象将工作委派给这些类的实例,而不是自行进行处理。2、结构图3、C++代码#include <iostream>#include <typeinfo>class Context;//状态基类声明了一些所有的具体状态类都需要实现的方法;并且提供了一个与状态关联的Context对象//的回溯引用。状态类使用该回溯引用转换到其他原创 2020-11-24 16:17:24 · 200 阅读 · 0 评论 -
访问者模式--行为模式
1、描述访问者是一种行为设计模式,允许你在不修改已有代码的清空下向已有类层次结构中添加新的行为。2、结构图3、C++代码#include <iostream>#include <string>#include <array>/** * The Visitor Interface declares a set of visiting methods that correspond to * component classes. The sig原创 2020-11-24 15:17:14 · 206 阅读 · 0 评论 -
备忘录模式--行为模式
1、描述备忘录是一种行为设计模式,允许生成对象状态的快照并在以后将其还原。备忘录不会影响它所处理的对象的内部结构,也不会影响快照中保存的数据。2、结构图3、C++代码#include <string>#include <iostream>#include <vector>#include <time.h>//备忘录接口提供了一种获取元数据的方法,例如创建日期或名称。但是,它不会暴露发起者的状态class Memento {原创 2020-11-24 13:50:13 · 196 阅读 · 0 评论 -
外观模式--结构型模式
1、描述外观是一种结构型设计模式,能为复杂系统、程序库或框架提供一个简单(但有限)的接口尽管外观模式降低了程序的整体复杂度,但它同时也有助于将不需要的依赖移动到同一个位置。2、结构图3、C++代码#include <string>#include <iostream>//外观类可以使用子系统,客户也可以直接使用子系统//对于子系统来说,外观类也是另一个客户,而不是子系统的一部分。class Subsystem1 { public: std::原创 2020-11-24 11:22:21 · 173 阅读 · 0 评论 -
观察者模式--行为模式
1、描述观察者是一种行为设计模式,允许一个对象将其状态的改变通知其他对象。观察者模式提供了一种作用于任何实现了订阅者接口的对象的机制,可对其事件进行订阅和取消订阅。2、结构图3、C++代码#include <iostream>#include <list>#include <string>class IObserver { public: virtual ~IObserver(){}; virtual void Update(c原创 2020-11-24 10:44:07 · 242 阅读 · 0 评论 -
组合模式--结构型模式
1、描述组合是一种结构型设计模式,你可以使用它将对象组合成树状结构,并且能向使用独立对象一样使用它们。对于绝大多数需要生成树状结构的问题来说,组合都是非常受欢迎的解决方案。组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。2、结构图Component:描述了树中简单项目和负责项目共有的操作 Leaf:树的基本结构,它不包含子项目。一般情况下,叶结点最终会完成大部分的实际工作,因为它们无法将工作指派给其他部分 Composite:包含叶节点或其他容器等子项目的单位。容器不原创 2020-11-24 10:02:34 · 224 阅读 · 0 评论 -
迭代器模式--行为模式
1、描述2、结构图3、C++代码原创 2020-11-24 09:09:48 · 131 阅读 · 0 评论 -
适配器模式--结构型模式
1、描述适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作。2、结构图对象适配器实现时使用了构成原则:适配器实现了其中一个对象的接口,并对另一个对象进行封装。所有流行的编程语言都可以实现适配器。client是包含当前程序业务逻辑的类 Target描述了其他类与客户端代码合作时必须遵循的协议 Adaptee中有一些功能类,客户端与其接口不兼容,因此无法直接调用其功能 Adapter是一个可以同时与客户端与服务交互的类:它在实现客户端接口的同时封帐了服务对象...原创 2020-11-23 18:08:07 · 273 阅读 · 0 评论 -
策略模式--行为模式
1、描述策略是一种行为设计模式,它将一组行为转换为对象,并使其在原始上下文对象内部能够相互替换。原始对象被称为上下文,它包含指向策略对象的引用并将执行行为的任务分派给策略对象。2、结构图3、C++程序#include <string>#include <vector>#include <iostream>#include <algorithm>//策略抽象类声明了默写算法所有受支持版本的通用操作class Strategy原创 2020-11-23 16:44:53 · 244 阅读 · 0 评论 -
装饰模式--结构型模式
1、描述装饰是一种结构设计模式,允许你通过将对象放入特殊封装对象中来为原对象增加新的行为。由于目标对象和装饰器遵循同一接口,因此你可用装饰来对对象进行无限次的封装。结果对象将获得所有封装器叠加而来的行为。2、结构图3、C++代码#include <string>#include <iostream>//基础组件定义了可以被装饰器修改的操作class Component { public: virtual ~Component() {} virt原创 2020-11-23 15:21:20 · 215 阅读 · 0 评论 -
责任链模式--行为模式
1、描述责任链是一种行为设计模式,允许你将请求沿着处理者链进行发送,直至其中一个处理者对其进行处理。该模式允许多个对象来对请求进行处理,而无需让发送者类与具体接受者类相耦合。链可在运行时由遵循标准处理者接口的任意处理者动态生成。2、结构图3、C++代码...原创 2020-11-23 14:16:25 · 202 阅读 · 0 评论 -
命令模式--行为模式
1、描述命令是一种行为设计模式,它可将请求或简单操作转换为一个对象。此类转换让你能够延迟进行或远程执行请求,还可将其放入队列中。2、结构图3、C++代码#include <iostream>#include <string>//命令接口声明了一个执行命令的方法class Command { public: virtual ~Command() { } virtual void Execute() const = 0;};//一些.原创 2020-11-23 11:28:30 · 314 阅读 · 0 评论 -
中介者模式--行为模式
1、描述中介者是一种行为设计模式,让程序组件通过特殊的中介者对象进行间接沟通,达到减少组件之间依赖关系的目的。中介者能使得程序更易于修改和扩展,而且能更方便地对独立的组件进行复用,因为它们不再依赖于很多其他的类。2、结构图3、C++代码#include <iostream>#include <string>//中介者接口声明了一个能让组件将各种事件通知给中介者的方法。中介者可对这些事件//做出响应并将执行工作传递给其他组件class BaseCompo原创 2020-11-23 10:31:34 · 137 阅读 · 0 评论 -
原型模式--创建型模式
1、描述原型是一种创建型设计模式,使你能够复制对象,甚至是复杂对象,而又无需使代码依赖它们所属的类。所有的原型类都必须有一个通用的接口,使得即使在对象所属的具体类未知的情况下也能复制对象。原型对象可以生成自身的完整副本,因为相同类的对象可以相互访问对方的私有成员变量。2、结构图3、C++代码#include <string>#include <vector>#include <iostream>#include <unordered_ma原创 2020-11-23 09:14:14 · 265 阅读 · 0 评论 -
代理模式--结构型模式
1、描述代理是一种结构型设计模式,让你能提供真实服务对象的替代品给客户端使用。代理接收客户端的请求并进行一些处理(访问控制和缓存等),然后再将请求传递给服务对象。代理对象拥有和服务对象相同的接口,这使得当其被传递给客户端时可与真实对象互换。2、结构图Subject声明了服务接口,代理必须遵循该接口才能伪装成服务对象 RealSubject提供了一些实用的业务逻辑 Proxy包含了一个指向RealSubject对象的引用成员变量。代理完成其任务(例如延迟初始化、记录日志、访问控制和缓存原创 2020-11-23 08:23:41 · 148 阅读 · 0 评论 -
生成器模式--创建型模式
1、描述生成器模式是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。2、结构图生成器(Builder)接口声明在所有类型生成器中通用的产品构造步骤 具体生成器(ConcreateBuilder)提供构造过程的不同实现。具体生成器也可以构造不遵循通用接口的产品 产品(Product)是最终生成的对象。由不同生成器构造的参评无需属于同一类层次结构或接口 主管(Director)类定义调用构造步骤的顺序,这样你就可以创建和复用特定...原创 2020-11-23 08:21:38 · 257 阅读 · 0 评论 -
模板方法模式--行为模式
1、描述模板方法是一种行为设计模式,它在基类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。2、结构图抽象类(AbstractClass)会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现 具体类(ConcreteClass)重写所有步骤,但不能重写模板方法自身。3、C++代码#include <iostream>#include <string>//抽象类定义了一个模原创 2020-11-23 08:20:34 · 123 阅读 · 0 评论 -
抽象工厂模式--创建型模式
1、描述抽象工厂模式是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类。什么是“系列对象”?例如有这样一组的对象:运输工具+引擎+控制器。它可能会有几个变体:汽车+内燃机+方向盘 飞机+喷气式发动机+操纵杆如果你的程序中并不涉及产品系列的话,那就不需要抽象工厂。2、结构图3、C++代码#include <string>#include <iostream>// 系列产品中的特定产品必须有一...原创 2020-11-22 16:24:00 · 248 阅读 · 0 评论 -
简单工厂模式--创建型模式
描述:简单工厂模式描述了一个类,它拥有一个包含大量条件语句的构建方法,可根据方法的参数来选择对何种产品进行初始化并将其返回。简单工厂通常没有子类,但当从一个简单工厂中抽取出子类后,它看上去更像经典的工厂方法模式了。结构图:C++实现:#include <string>#include <iostream>// 产品接口中将声明所有具体产品都必须实现的操作。class Product { public: virtual ~Product() {}原创 2020-11-22 15:10:54 · 164 阅读 · 0 评论 -
工厂方法模式--创建型模式
工厂方法是一种创建型设计模式,解决了在不指定具体类的情况下创建产品对象的问题。1、结构图2、C++代码#include <string>#include <iostream>// 产品接口中将声明所有具体产品都必须实现的操作。class Product { public: virtual ~Product() {} virtual std::string Operation() const = 0;};// 具体产品需提供产品接口的各种实现。原创 2020-11-22 14:55:13 · 303 阅读 · 0 评论 -
单例模式--创建型模式
1、描述单例是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。单例拥有与全局变量相同的优缺点。尽管它们非常有用,但却会破坏代码的模块化特性。2、结构图3、C++代码在muduo库中有一个单例类模板,可以参考https://blog.youkuaiyun.com/qu1993/article/details/109476614下面是一个使用互斥锁实现的线程安全的单例类,这个例子是最后提到的网站的例子,但我觉得这个例子不太好#include <...原创 2020-11-22 14:37:46 · 737 阅读 · 1 评论 -
开闭原则
《设计模式之禅》定义:Software entities like classes,moduls and functions should be open for extension but closed for modifications.(一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。)开闭原则告诉我们赢尽量通过扩展 软件实体的行为来实现变化,而不是通过修改已有的代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则。为什么要采用开闭原则首先,开闭原则原创 2020-11-22 12:52:07 · 133 阅读 · 0 评论 -
迪米特法则
《设计模式之禅》定义:迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP),虽然名字不同,但描述的是同一个规则:一个对象应该对其他对象有最少的了解。通俗的讲,一个类应该对自己需要耦合或调用的类知道的最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。迪米特法则对类的低耦合提出了明确的要求,其包含以下4层含义:只和朋友交流原创 2020-11-22 12:50:14 · 91 阅读 · 0 评论 -
接口隔离原则
《设计模式之禅》定义:Clients should not be forced to depend upon interfaces that they don't use.(客户端不应该依赖它不需要的接口。)The dependency of one class to another one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上。)...原创 2020-11-22 12:49:37 · 79 阅读 · 0 评论 -
依赖倒置原则
《设计模式之禅》依赖倒置原则(Dependence Inversion Principle,DIP)。定义:High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.高层模块不应该依赖底层模块,两原创 2020-11-22 12:48:56 · 100 阅读 · 0 评论 -
里氏替换原则
第一种定义,也是最正宗的定义:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序原创 2020-11-22 12:47:38 · 189 阅读 · 0 评论 -
单一职责原则
《设计模式之禅》:单一职责原则(Single Responsibility Principle),简称SRP。定义:应该有且仅有一个原因引起类的变更。There should never be more than one reason for a class to change。单一职责原则的好处:类的复杂性降低,实现什么职责都有清晰明确的定义; 可读性高,复杂性降低,那当然可读性提高了; 可维护性提高,可读性提高,那当然更容易维护了; 变更引起的风险降低,变更时必不可少的,如果接口的原创 2020-11-22 12:41:52 · 144 阅读 · 0 评论