![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
C++实现23种设计模式
蚂蚁不吃土&
认认真真做好自己正在做的事并努力做到极致
展开
-
【22】解释器模式
设计场景:一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子,这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题。举一个简单的例子,给出一个指定格式的字符串,在另一个字符串中搜索与其匹配的子串,显而易见会想到正则表达式,正则表达式便是解释器模式的一种应用。问题描述:1、解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。2、目的:解释器就是当一种语言需要解释时,并且该语言中的多个句子可原创 2022-01-24 00:01:04 · 242 阅读 · 0 评论 -
【23】访问者模式
设计场景:某个系统有比较稳定的数据结构,同时又有易于变化的算法,代码实现的过程中希望实现开放-封闭原则,也就是说在增加算法的过程中不会影响到数据结构类,对两者进行解耦合操作,同时在不修改现有的算法类的基础上对算法进行扩展。问题描述:1、访问者模式:可以说它是一个操作,作用于某对象结构中的各个元素;可以在不改变这些元素的前提下定义作用于这些元素的新操作。【注:可以将对象结构看作基类,各个元素看作子类】2、访问者模式的特点:(1)适用条件:适用于数据结构相对稳定的系统,它可以将数据结构和作用于数据原创 2022-01-23 15:19:47 · 414 阅读 · 0 评论 -
【19】命令模式
设计场景:需求中有不同的请求,同时可能需要对这些请求进行排队或者记录请求日志,以及支持可撤销的操作;问题描述:1、命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作;2、命令模式的优点:(1)易设计一个命令队列;(2)易将命令计入日志;(3)允许接受请求的一方拥有否决权,接受或不接受;(4)易实现命令的撤销和重做;(5)易增加新的具体命令,具体命令间互不干扰;(6)易将请求、如何操作两者分开;UML图:原创 2022-01-17 21:52:43 · 318 阅读 · 0 评论 -
【17】单例模式
设计场景:在整个系统周期内,保证一个类只有唯一的一个实例被创建;问题描述:(1)单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点;(2)通常我们可以让一个全局变量使得一个对象被访问,但是它不能防止你实例化多个对象,一个最好的方法就是,让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且它提供一个访问该实例的方法;(3)单例模式分为懒汉式和饿汉式,区别在于创建实例的时间不同,同时还要考虑其线程安全性;(4)懒汉式:程序运行中,实例并不存在,只有当需要该实例时,才原创 2022-01-08 22:25:24 · 179 阅读 · 0 评论 -
【10】观察者模式
项目场景:待更新问题描述:待更新 代码实现:#pragma once#include<vector>#include<string>using namespace std;#include"observe.h"// 主题类class Subject{public: // 添加观察者 void attach(Observe* observe) { m_observes.push_back(observe); } // 删除观察者 简化操作原创 2022-01-03 14:46:11 · 251 阅读 · 0 评论 -
【9】建造者模式
设计场景:用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。模板模式特点:(1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式;(2)最近看的有点绕,不分析了,困了,先睡了,缓缓再整理更新 代码实现:(1)框架代码#pragma once#include<iostream>#include<string>#include<vector>using namesp原创 2022-01-03 02:07:32 · 325 阅读 · 0 评论 -
【8】外观模式
设计场景:某一系统需要维护,但是直接对老系统修改和扩展会产生很多问题,考虑通过外观模式解决此问题外观模式:(1)为子系统中的一组接口提供一个一致的高层接口,这个接口使得这一系统更加容易使用;代码实现: 解决方案:分两个小组,一个开发 Facade 与老系统的交互,另一个只需要了解 Facade 的接口,直接开发新系统调用这些接口即可#pragma once#include<iostream>// 子系统 A 类class SYSTEM_A{public: vo原创 2022-01-02 19:47:08 · 213 阅读 · 0 评论 -
【7】模板模式
设计场景:类与类之间出现很多相同的行为,导致在子类的实现过程中产生重复代码模板模式特点:(1)提供了一个很好的代码复用平台;(2)将子类之间共有的不变的行为搬移到父类,从而体现出去除了子类中重复代码的优势;(3)当不变的行为和可变的行为在方法的子类实现中混合在一起时,不变的行为就会在子类间重复出现,通过模板方式将这些不变的行为搬移到父类中,帮助子类摆脱重复的不变的行为的纠缠;代码实现:(1)框架代码#pragma once#include<iostream>using原创 2022-01-02 18:38:01 · 218 阅读 · 0 评论 -
【5】工厂模式
设计场景:工厂模式实现计算机基础加减乘除运算原因分析:简单工厂模式与工厂模式的区别写了一半还没写完,先睡了代码如下:#include"factory.h"#include"add_factory.h"#include"sub_factory.h"#include"mul_factory.h"#include"div_factory.h"#include"add_operation.h"#include"sub_operation.h"#include"mul_operatio原创 2021-12-30 23:42:04 · 269 阅读 · 0 评论 -
【4】代理模式
场景:设计场景:男孩暗恋女孩 ,但女孩不认识男孩,男孩的伙伴认识女孩,于是男孩委托伙伴向女孩送花解决方案:设计模式:使用代理模式,将送礼物作为追求者和代理的公共接口。抽象类:类中至少有一个纯虚函数,抽象类不能生成对象,作为父类,其子类必须实现纯虚函数的定义,否则子类成为抽象类,纯虚函数实现定义后成为虚函数。接口:是一种特殊的抽象类,类中没有定义任何的成员变量,所有的成员函数都是公有的,所有的成员函数都是纯虚函数。代码如下:#include"schoolGirl.h"#include"原创 2021-12-30 22:54:21 · 134 阅读 · 0 评论 -
UML类图
UML类图优雅的代码,简练、易维护、易扩展、易复用UML类图更助于理解面向对象类图:动物;接口图:飞翔;继承关系:鸟 继承 动物;实现接口:大雁 实现 飞翔接口;关联关系:企鹅 需要了解 气候;聚合关系:雁群是整体,大雁是部分,两者存在的周期不同;组合关系:鸟是整体、翅膀是部分,两者存在周期相同;依赖关系:动物依赖氧气、水,动物的存在前提是有足够的氧气和水;...原创 2021-12-29 01:00:36 · 686 阅读 · 0 评论 -
【2】策略模式&简单工厂模式
一、策略模式&简单工厂模式1、需求:某商场三种收费方式、联想商场收费方式的复杂性编写合适的代码、采用面向对象编程;2、思路:仅仅使用简单工厂模式实现当前需求,不利于后期维护和扩展;仅仅使用策略模式,在编码过程中过程比较笨拙繁琐,难以和客户端进行很好的交互;使用策略模式&简单工厂模式恰好;代码如下(示例):#pragma onceusing namespace std;// 基类-----现金收费抽象类-----抽象策略class CashSuper{public:原创 2021-12-28 22:38:20 · 661 阅读 · 0 评论 -
【1】简单工厂模式
一、简单工厂模式1.封装体现面向对象的封装的思想代码如下(示例):#pragma once#include<iostream>#include<string>using namespace std;// 操作类class Operation{public: enum oper{add,sub,mul,div}; static double getResult(double numberA, double numberB, int operate); //原创 2021-12-26 00:28:01 · 219 阅读 · 0 评论