设计模式
文章平均质量分 58
记录学习设计模式
StudyWinter
持续学习
展开
-
设计模式总结
开闭原则是对扩展开放,对修改关闭。增加功能是通过增加代码来实现的,而不是去修改源代码。写一个抽象的计算器类,即接口,定义相应的方法,将方法定义成纯虚函数,以便子类继承时实现。当我们需要加法时,定义加法类继承抽象的计算器类,再实现接口里面的方法。当加入其他功能时,再写个类继承抽象类即可,以此类推。详见:【设计模式】开闭原则_StudyWinter的博客-CSDN博客迪米特原则,也称为最少知识原则。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话原创 2022-07-05 20:36:02 · 325 阅读 · 0 评论 -
【设计模式】09 装饰器模式
1.1装饰器模式定义装饰器模式(Decorator Pattern),也叫包装模式 Wrapper Pattern是指在不改变原有对象的基础之上,将功能附加到对象上.提供了比继承更灵活的替代方法 属于结构型模式.1.2装饰器的UML类图从类图分析 主要包含4种角色抽象组件(Component):可以是一个接口或者抽象类:其充当被装饰类的原始对象,定义了被装饰的对象方法(既 抽出公用的方法)具体实现类(ConcreteComponent): 继承/实现Component的一个具体对象,也是被.原创 2021-05-08 19:48:50 · 101 阅读 · 0 评论 -
【设计模式】08 观察者模式
观察者模式的动机:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式解决什么问题:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。观察者模式的使用场合在以下任一情况下都可以使用观察者模式:(1)当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;(2)一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变.原创 2021-05-07 14:57:27 · 138 阅读 · 0 评论 -
【设计模式】07 命令模式
命令模式:将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。命令模式可以将请求发送者和接收者完全解耦,,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求。而不必知道如何完成请求。定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复.原创 2021-05-06 16:05:31 · 91 阅读 · 0 评论 -
【设计模式】06 策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。如果使用多重条件原创 2021-05-05 17:06:57 · 115 阅读 · 0 评论 -
【设计模式】05 模版方法模式
模板方法模式(Template Method Pattern):定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。简单来说,当你频繁地需要执行某些操作,这其中的操作有共性,也有差异性的地方,我们可以用模板方法把共性的操作抽取出来,即定义一个操作中算法的“框架”,把差异性的步骤延迟到子类中,即让子类来实现差异化的步骤。原文链接:https://blog.csdn.net/Fiuty_Da/article/details/10.原创 2021-05-05 16:09:09 · 98 阅读 · 1 评论 -
【设计模式】04 适配器模式
摘要 将两种完全不同的事物联系到一起,就像现实生活中的变压器。假设一个手机充电器需要的电压是20V,但是正常的电压是220V,这时候就需要一个变压器,将220V的电压转换成20V的电压,这样,变压器就将20V的电压和手机联系起来了。 适配器模式就是将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。模式中的角色目标接口(Target):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。需要适配的类(Ad.原创 2021-05-05 15:15:44 · 139 阅读 · 0 评论 -
【设计模式】03 外观模式
1、外观模式根据迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库、子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。2、UMLFacade: 系统对外的统一接口,系统内部系统地工作。 SubSystemA,B,C,D: 子系统。3、简单案例(1)使用外观模式整合各个系统#include &..原创 2021-05-04 17:03:27 · 87 阅读 · 0 评论 -
【设计模式】02 代理模式
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。UML 图:角色:Subject: 抽象角色:声明真实对象和代理对象的共同接口。Proxy: 代理角色代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象。代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行...原创 2021-05-04 15:43:24 · 94 阅读 · 1 评论 -
【设计模式】01 单例模式
1、单例模式概念:单例模式是一种常用的软件设计模式。它的核心结构只包含一个被称为单例的特殊类。它的目的是保证一个类仅有一个实例。应用场景:有一些对象只需要一个,如:一台PC连接一个键盘、任务管理器只能打开一个。其构建步骤:(1)把构造函数私有化;(2)增加静态的、私有的 类的指针变量;(3)提供静态的对外接口,可以让用户获得单例对象。class A{private: //1、把构造函数私有化 A() { a = new A; }private: //2原创 2021-05-03 22:20:18 · 160 阅读 · 0 评论 -
【设计模式】抽象工厂模式
我们知道在工厂方法模式有缺点(1)增加系统中类的个数,复杂度和理解度增加;(2)增加了系统的抽象性和理解难度。继续设想生产水果的事例,假设这时候不仅有A地的水果(包括苹果、香蕉、鸭梨),还有B地、C地的水果。提出抽象工厂模式:抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。产品族:一个品牌下面的所有产品;例如A地的苹果、香蕉、鸭梨。产品等级:多个品牌下面的同种产品;例如A地、B地、C地的苹果。...原创 2021-04-29 22:57:43 · 101 阅读 · 0 评论 -
【设计模式】工厂方法模式
之前提到了简单工厂模式。其主要缺点:(1)简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响;(2)工厂类代码会非常臃肿,违背高聚合原则,违背开闭原则。那么如果实现开闭原则呢?对于之前的“水果工厂”的例子,使用 工厂方法模式 进行完善,即将工厂也抽象出来,一种具体工厂生产特定的水果。#include <iostream>using namespace std;//抽象的水果class AbstractFruit{pu..原创 2021-04-29 16:28:04 · 84 阅读 · 2 评论 -
【设计模式】简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。设想这样一个场景,有几种水果:苹果、香蕉、鸭梨,当我们需要创建某个水果时,需要逐一对接。使用简单工厂模式来创建相应的对象,当需要某个水果时,直接和“水果工厂”交互即可;亦或者在某些特定情况下,只需要水果对象,但是...原创 2021-04-28 20:09:19 · 90 阅读 · 0 评论 -
【设计模式】依赖倒转原则
依赖倒转原则又称依赖倒置原则:抽象不应该依赖细节,细节应该依赖于抽象。说白了,就是针对接口编程,不要针对实现编程。依赖倒置原则包含三层含义:(1)高层模块不应该依赖低层模块,两者都应该依赖其抽象;(2)抽象不应该依赖细节;(3)细节应该依赖抽象。传统的模式,是编写底层业务,然后中层模块依赖底层模块,高层模块又依赖中层模块。如图。假设这样一个场景,可以在银行办理存款、支付、转账业务,再对具体的业务进行封装,形成中层业务 ,高层业务再依赖中层业务。#include <.原创 2021-04-27 20:25:11 · 233 阅读 · 0 评论 -
【设计模式】合成复用原则
合成复用原则是指:尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。设想这样一个案例:加入要开车,有几种不同的车型,使用继承的话,代码如下class AbstractCar{public: virtual void run() = 0;};//大众class Volk :public AbstractCar{public: virtual void run() { cout << "大众车启动了" << endl; }};原创 2021-04-25 18:14:03 · 332 阅读 · 0 评论 -
【设计模式】迪米特原则
迪米特法则,也称为最少知识原则。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。即一个对象应该对其他对象有最少的了解,就是一个类应该对自己需要耦合或调用的类知道的最少,被耦合或调用的类内部是如何的复杂和我没有任何的关系,我只需知道它们提供的public方法即可。迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别.原创 2021-04-24 23:06:40 · 167 阅读 · 0 评论 -
【设计模式】开闭原则
1、开闭原则开闭原则是对扩展开放,对修改关闭。增加功能是通过增加代码来实现的,而不是去修改源代码。什么意思呢?下面看一个具体的案例有一个计算器类,其目前的功能有加、减、乘、除。//计算器类class Calculator{public: //构造函数 Calculator(int a, int b, string m_operator) :m_A(a), m_B(b), m_Operator(m_operator) { } int getResult() {原创 2021-04-23 20:38:29 · 208 阅读 · 0 评论