CPP - 设计模式篇
文章平均质量分 73
CPP设计模式
lp_oreo
hahh
展开
-
设计模式-状态模式
设想一下,现在你正上课,但是一节课随着老师是否关注着你,你都会有不同的状态,比如现在老师正在写板书,你可以偷偷的休息一下;当老师写完板书之后,你就需要老老实实的记笔记了。为了表达动作伴随状态而改变的逻辑,你可以使用if-else或者switch来进行相应的调整。但是在实际过程中,这一状态以及动作并不是固定的,会随机的进行改变,这样就需要经常修改条件语句。为了将状态逻辑与动作行为分离开,我们可以使用状态模式进行编程。状态模式是指允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就...原创 2022-04-29 16:33:17 · 161 阅读 · 0 评论 -
设计模式-命令模式
在发送者类与接收者类发送消息以及接受消息之间,可能并不能直接进行对话,或者说发送者不关系接收者是谁,而接收者也不需要发送者是谁。这样的一个关系特别像一个老板说,我不关系你怎么做,我只关系这件事的能不能成功。老板只负责发送命令,而并不关系过程,只关心结果。因此,这样的一个运行机制可以通过命令模式进行实现1. Reciver类的编写class Reciver{public: void action(){ cout << "reciver接受到了命令";.原创 2022-04-28 21:53:28 · 1029 阅读 · 0 评论 -
设计模式-装饰模式
顾名思义,装饰模式就是在现有类的基础上添加一些装饰。以这篇博客中提供的背景为例,假设现在华为以及小米手机厂商生产出来了一批手机,但是需要给这些手机添加一些装饰,比如给华为手机贴钢化膜、给小米手机配上一个手机壳。这其实并不需要再设计一个类,并在这些手机类的基础上添加一些功能,这样做太麻烦了。一个简单的做法就是给这些手机类添加一个装饰类,在这以及类的基础上,额外添加一些装饰。从上述UML图不难得知,Phone需要作为装饰器类的一个私有成员变量,从而可以对Phone...原创 2022-04-28 17:24:24 · 191 阅读 · 0 评论 -
设计模式-策略模式
在策略模式中,这篇文章写的就比较好,因此在该文章的基础上进行了微调。策略模式是说,在一个类实际执行某个任务的时候,可能要根据实际情况选择不同的方法(策略),而这个不同方法(策略)的切换就可以通过类的多态来实现,只要当前类中有所有策略的基类,就可以使用指针或者模板进行调整。在缓存器(Cache)模块中,读取数据需要涉及到不同的方法,使用不同的类对每种方法进行封装,那么缓存器在实际应用的过程中就可以随意的调整不同的算法(策略),从而实现最优的效率。1. 抽象接口 ...原创 2022-04-28 15:07:27 · 131 阅读 · 0 评论 -
设计模式-代理模式
顾名思义,代理模式就是给一个类寻找一个代理类,对其暴露在外的方法进行一定的限制。比如,我们在外找房子的时候通常需要找一个代理(中介),委托中介与房东打交道从而进行房租的租赁等活动。这个代理就可以规避一些我们所不关注的东西,比如这个房子的房主是谁,是通过什么渠1道买的等,这些信息实际上对我们而言可有可无。1. 代理模式如上图所示,Proxy类作为landloard类的代理类,可以代表房东与房客进行商谈,从而隐藏一些信息。在下面的代码中,我们就隐藏了房东对房子的一些隐私...原创 2022-04-28 14:26:39 · 119 阅读 · 0 评论 -
设计模式-适配器模式
最近马斯克以440亿美元收购了推特,之前两个公司的运行是独立的,但是推特被收购之后,马斯克就需要对推特公司及其其他公司进行消息的发布以及人员的管理。比如现在马斯克需要对SpaceX公司以及Twitter公司进行人员的调整,但是SpaceX公司以及Twitter的公司消息发布的函数不一样。举个栗子,推特公司发布消息的函数叫做twitterPublish(),而在SpaceX公司中发布消息的函数叫做spaceXPublish()。这两个公司发布消息的方法名称不同,但是含义是一样的,现在你作为马斯...原创 2022-04-27 21:43:58 · 279 阅读 · 0 评论 -
设计模式-外观模式与组合模式
1. 外观模式顾名思义,外观模式就是说将这个类的内部执行流程都进行了封装,程序员只能够“外部”接口进行操作,而具体的执行过程并不可见。比如我们写的C++代码在生成可执行文件的过程之通常要经过预处理、编译、汇编与链接四个步骤,但是在windows的VSCode编译器下我们并不需要操心以上四个流程,我们只需要点击运行就能够得到可执行程序。因此,在VSCode类中,只需要在公共接口中依次进行上述四个步骤即可对现有代码进行运行。 下面就是整个流程代码:#inclu...原创 2022-04-27 19:36:26 · 2366 阅读 · 0 评论 -
设计模式-迭代器模式
迭代器模式在容器类中经常使用,该模式可以解决两个问题:第一个问题,处于面向对象封装特性的考虑,我们希望程序员尽可能不获取容器的私有数据就能够遍历所有的数据,但是有希望能够提供一个接口,供程序员获取所有的私有数据,因此可以借助迭代器辅助容器类进行数据的访问;第二个问题,在C++中提供了vector、map以及list等容器,他们的提供了不同的方法让程序员去遍历容器中的所有数据,这显然增加了程序员去熟记不同方法的代价,那么能不能给这些容器提供一个统一的接口,从而实现一个接口比遍历不同容器的...原创 2022-04-27 13:50:30 · 242 阅读 · 0 评论 -
设计模式-观察者模式
观察者模式的应用遍布在我们的生活中,比如在csdn中,当你关注的博主发布新的文章的时候,他的所有粉丝都会收到相关的通知,作为粉丝的你看到这个通知之后,可能会忽略也可能会点进去相关链接查看。因此,以CSDN博主与粉丝之间的关系为例,介绍并使用C++实现这个常用的观察者与消费者模式(发布-订阅模式),为了后续描述方便,使用发布者与订阅者模式代替观察者模式。这其中主要涉及到四个类别:抽象发布者类,具体发布者类,抽象订阅者类以及具体订阅者类。1. 抽象发布者类以及抽象订阅者类 其中,Fan...原创 2022-04-26 22:16:02 · 1505 阅读 · 0 评论 -
设计模式-模板工厂
在上一节的抽象工厂中,已经实现对某一品牌产品工厂的设计了,但是抽象工厂依然存在一定的问题,就是一旦需要额外新增生产别的产品的话,就依然需要对工厂类进行修改,这显然违背了“对扩展开放,对修改封闭”的原则。为此,提出了模板工厂的设计模式,让整个工厂类从具体的产品中抽离开,利用“模板编程”的思想,即使产品种类发生了变化,做到依然不需要更改工厂类。如上图所示,在抽象工厂类中,我们定义了一个produce纯虚函数,该纯虚函数返回抽象产品类的指针。而在具体的工厂类中,当传递了抽象...原创 2022-04-26 12:18:04 · 751 阅读 · 3 评论 -
设计模式-抽象工厂模式
在工厂方法模式中,我们提出让每个工厂都负责生产一种鞋子。为了扩展每个工厂的生产种类,以LiNing工厂为了,让该工厂在生产鞋子的同时还能够生产衣服。上述模式涉及到的类主要包括:抽象产品类、具体产品类、抽象工厂类以及具体工厂类。1. 抽象产品类在抽象产品类中主要包括鞋类和衣服两个抽象类:class Clothes{public: Clothes(){}; virtual ~Clothes(){}; virtual void wear(...原创 2022-04-25 20:16:58 · 391 阅读 · 0 评论 -
设计模式-工厂方法模式
在上一节中,我们介绍了简单工厂模式,该模式的特点是我们可以指定工厂去创建什么类型的鞋子类,因为该工厂已经继承了创建所有鞋子类的方法了。但是简单工厂模式的可扩展性较差,一旦我们有新的类型的鞋子需要生产了的话,我们就需要修改工厂类。为了减少对工厂类的修改,提出了工厂方法模式:对每种鞋子都分配一个工厂类,也就是说每个工厂类都只负责生产一类鞋子。这样,一旦有了新种类的鞋子需要生产的时候,我们可以再扩展一个鞋子工厂去负责生产这类鞋子。所以,工厂方法模式又称之为流水线模式。如上图...原创 2022-04-25 19:47:19 · 180 阅读 · 0 评论 -
设计模式-简单工厂模式
问题背景:一个工厂需要生产耐克鞋子(Nike)以及李宁鞋子(LiNing)两类鞋子,现在你是工程师,你该如何设计一个工厂类,使得整个工程支持生产这两种鞋子呢? 思路:目前已知需要生产两种鞋子,我们可以在工厂类中通过指定名称来创建两种不同的鞋子类。Nike和LiNing都是鞋子类,因此我们可以抽象出Shoes接口,让Nike和LiNing都实现该接口。整个流程主要涉及到三个类:工厂类、抽象产品类以及实际产品类。因此,我们分别实现这三个类就可以了。 1. Sh...原创 2022-04-25 17:50:17 · 248 阅读 · 0 评论 -
设计模式-单例模式
单例模式是非常简单且基础的设计模式之一。麻雀虽小五脏俱全,在单例模式的设计过程中依然涉及到众多的知识点,而且一个优秀的单例模式并不是一蹴而就完成的,其中涉及到内存泄漏、多线程以及泛型编程等知识点。因此,本文从网上搜集了些许资料,逐步从简单的单例模式出发,对其进行了不断的优化。单例模式是指该类只能有一个对象。因此,该类的构造函数、析构函数、复制构造函数以及赋值运算符都必须是private的,并且需要提供一个创建对象的公共接口。由于在程序运行期间,这个对象必须一致存在,所以这...原创 2022-04-20 17:02:13 · 520 阅读 · 2 评论 -
设计模式-生产者与消费者模式
最近正在看C++日志的开源代码,其中多个线程需要向文件中写入日志信息,该将该算法逻辑抽象出来的话就是生产者与消费者设计模式。常见的生产者与消费者模式主要分为四类:单生产者与单消费者模式、单生产者与多消费者模式、多生产者与单消费者模式以及多生产者与多消费这模式。下面将以此对上述的四种生产者与消费者模式进行分析。1 单生产者与单消费者模式在讲设计模式之前,需要明确什么是PV操作。PV操作是在多线程之间实现互斥与同步的算法。P操作(wait)是指只有当信号量大于等于0的时候...原创 2022-04-21 16:18:06 · 2469 阅读 · 0 评论 -
设计模式总结
目前,设计模式主要分为四类:创建者模式、结构型模式、行为模式以及其他模式。为了后续的复习与巩固,本文将针对上述的设计模式进行研究与分析,希望在记录的过程中也能够帮助其他人。创建者模式:工厂方法模式、抽象工厂模式、生成器模式、原型模式与单例模式。结构型模式:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式与代理模式。行为模式:责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法...原创 2022-04-25 15:43:15 · 121 阅读 · 0 评论