设计模式
文章平均质量分 60
代码设计模式介绍和应用案例代码实现
夜雨听萧瑟
每天进步一点点。
展开
-
设计模式之观察者模式(优先使用对象组合的原则)的C++实现
实现订阅发布模式,这种设计的优点是想订阅数据的类不需要继承订阅者类的抽象类,减少了一层类的继承;当然,具体情况需要可根据需求进行订阅者发布者模式的代码设计。原创 2024-04-21 13:40:59 · 442 阅读 · 0 评论 -
设计模式之解析器(Interpreter)的C++实现
设计模式之解析器(Interpreter)的C++实现。在软件开发的过程中,需要实现一种需求,该需求的结构稳定,但是需求的业务内容会频繁变化,如果使用普通语法实现需求,需要经常更新代码,不具有灵活性。可以使用解析器模式解决实现该类需求,解析器是实现一种能够解析该需求结构语法的功能代码,针对不同的业务调用对应的解析规则代码。有一个字符串的加减计算,如'a+b+c-d-e',其中a,b,c,d,e分别对应带计算的值。原创 2023-09-17 13:01:16 · 402 阅读 · 0 评论 -
设计模式之访问器模式(Visitor)的C++实现
在软件开发过程中,早已发布的软件版本,由于需求的变化,需要给某个类层次结构增加新的方法。如果在该基类和子类中都添加新的行为方法,将给代码原有的结构带来破坏,同时,也违反了修改封闭,扩展开放的原则。访问器模式可以实现不改变原有代码结构的前提下,基于双向分发机制(2次虚函数绑定实例对象),通过扩展的方法实现新的接口。上面的代码,ConcreteElementA和ConcreteElementB的方法更新,通过Visitor基类的扩展子类来实现。(2)Visitor的子类必须实现Element的所有子类方法。原创 2023-09-09 21:08:55 · 308 阅读 · 0 评论 -
设计模式之命令模式(Command)的C++实现
命令设计模式(Command)的C++代码实现。在软件开发过程中,“行为请求者”和“行为实现者”通常呈现一种“紧耦合”。如果行为的实现经常变化,则不利于代码的维护。命令模式可以将行为的请求者和行为的实现者进行解耦。具体流程是将行为请求者封装成一个对象,将行为实现者抽象成一个类。原创 2023-08-27 17:46:43 · 1897 阅读 · 0 评论 -
设计模式之职责链模式(ChainOfResponsibility)的C++实现
职责链模式(ChainOfResponsibility)的C++代码实现。在软件开发过程中,发送者经常发送一个数据请求给特定的接收者对象,让其对请求数据进行处理(一个数据请求只能有一个对象对其处理)。职责链模式的处理流程是:设计一个职责链处理基类,该类具有指向下一个待处理类的变量,通过set接口设置下一个待处理的链对象成员;该类具有遍历处理请求的功能,遍历过程中,只要有一个对象处理了请求,则停止遍历;该基类抽象了2个接口分别为:判断是否处理该类型请求和处理消息的功能接口。其他的具体职责链类继承并实现职责链原创 2023-08-22 22:57:54 · 782 阅读 · 1 评论 -
设计模式之迭代器模式(Iterator)的C++实现
迭代器模式(Iterator)的C++实现,泛型编程实现迭代器的C++实现。在软件开发过程中,操作的集合对象内部结构常常变化,在访问这些对象元素的同时,也要保证对象内部的封装性。迭代器模式提供了一种利用面向对象的遍历方法来遍历对象元素。迭代器模式通过抽象一个迭代器类,不同的对象继承自迭代器类,外部通过统一接口访问元素。面向对象实现的迭代器模式是在程序运行时,通过虚函数去操作对象元素;相比于C++中的泛型编程实现迭代器的运行性能较低(泛型编程是在编译时已确定访问的元素),所以建议使用泛型编程实现迭代器。原创 2023-08-20 18:17:47 · 1260 阅读 · 0 评论 -
设计模式之组合模式(Composite)的C++实现
组合模式(Composite)的C++代码实现。在软件开发过程中,使用者Client过多依赖所操作对象内部的实现结构,如果对象内部的实现结构频繁发生变化,则使用者的代码结构将要频繁地修改,不利于代码地维护和扩展性;组合模式可以使用者代码与复杂地操作对象结构进行解耦,根据操作对象的实现结构抽象出一个的基类,让操作对象内部根据需求变化实现复杂数据地操作接口,则使用者使用操作对象提供的统一接口就可完成功能。原创 2023-08-20 13:30:38 · 695 阅读 · 0 评论 -
设计模式之备忘录模式(Memento)的C++实现
备忘录模式(Memento)的C++代码实现。在软件功能开发过程中,某些对象的状态在转换过程中,由于业务场景需要,要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。备忘录模式是在不破坏对象封装性的前提下,增加一个备忘录类,用于保存捕获对象的内部状态。当该对象需要回溯到之前状态时,只需调用备忘录接口获取之前的状态,并设置状态。原创 2023-08-19 22:01:29 · 970 阅读 · 0 评论 -
设计模式之状态模式(State)的C++实现
状态模式(State)的C++代码实现。在开发过程中,某些对象的状态经常面临变化,不同的状态,其对象的操作行为不同。比如根据状态写的if else条件情况,且这种条件变化是经常变化的,这样的代码不易维护。可以使用状态模式解决这类问题。状态模式是将状态值抽象成一个基类,将不同状态下的操作,封装成基类中的虚函数,使用者可以依赖抽象的基类来进行功能开发。原创 2023-08-19 14:51:36 · 945 阅读 · 0 评论 -
设计模式之中介者模式(Mediator)的C++实现
中介者模式(Mediator)的C++代码实现在软件组件开发过程中,如果存在多个对象,且这些对象之间存在的相互交互的情况不是一一对应的情况,这种功能组件间的对象引用关系比较复杂,耦合度较高。如果有一些新的需求变化,则不易扩展。中介者模式使用一个“中介对象”去管理对象间的关联关系,这个中介对象里面定义了对象间的数据统一交互接口,解耦对象间的直接交互依赖,从而提高代码的扩展性。原创 2023-08-18 19:23:06 · 840 阅读 · 0 评论 -
设计模式之适配器模式(Adapter)的C++实现
适配器模式(Adapter)的C++代码实现。由于使用环境的改变,之前一些类的旧接口放在新环境的功能模块中不再适用。适配器可以解决此类问题。适配器模式:通过增加一个适配器类,在适配器接口中做一些适配操作,将旧模块类转换成使用者Client类期望的接口。原创 2023-08-18 15:53:25 · 1423 阅读 · 0 评论 -
设计模式之代理模式(Proxy)的C++实现
代理模式(Proxy)的C++实现。在组件的开发过程中,有些对象由于某种原因(比如对象创建的开销很大,或者对象的一些操作需要做安全控制,或者需要进程外的访问等),会使Client使用者在操作这类对象时可能会存在问题:(1)使用者直接访问这种对象会使系统带来很多麻烦。(2)或者使用者使不能直接访问这类对象;使用代理模式就可以解决此类问题。有一个主题类,该类具有请求功能和数据转换功能。而Client使用者不能直接访问和操作它,只能间接的通过其它类进行访问操作。3、代理模式的代码实现。原创 2023-08-18 12:52:24 · 1316 阅读 · 0 评论 -
设计模式之门面模式(Facade)的C++实现
门面模式(Facade)的C++实现。在组件的开发过程中,某些接口之间的依赖是比较紧密的,如果某个接口发生变化,其他的接口也会跟着发生变化,这样的代码违背了代码的设计原则。门面设计模式是在外部客户程序和系统程序之间添加了一层中间接口,使依赖的接口之间相互解耦。有3个公司,每个公司都有自己的工作流方式;客户端代码使用这3个公司的工作流。3、门面模式代码实现。原创 2023-08-17 22:28:50 · 680 阅读 · 0 评论 -
设计模式之享元模式(Flyweight)的C++代码实现
面向对象很好地解决了抽象问题,但是创建对象会带来一定的内存开销。绝大部分情况下,创建对象带来的内存开销是可以忽略不计的;在有些情况下是需要谨慎处理的,如类A的sizeof是50个字节,则创建50*1024*100个A对象,则对象的内存大小约为5MB,这个是很占用内存的。享元模式就是使用运用共享技术支持创建大量的对象情况,并同时减少内存开销。有3种类型产品,这几种类型产品的形状和大小各不相同;现有1000个产品(3种类型),分别输出这些产品的类型和大小。原创 2023-08-17 12:42:55 · 93 阅读 · 0 评论 -
设计模式之构建器(Builder)C++实现
构建器模式的C++代码实现。在软件功能开发中,有时面临“一个复杂对象”的创建工作,该对象的每个功能接口由于需求的变化,会使每个功能接口发生变化,但是该对象使用每个功能实现一个接口的流程是稳定的。构建器就是解决该类现象的。构建就是定义一个抽象类,然后将变化的每个功能接口定义为虚函数,稳定的流程定义为函数接口;其他有变化的类继承该抽象类。有一个产品需要经过设计、制作、包括、出售这几个步骤,才可以完成整个功能。每个产品都会有这几个步骤,但每个产品对应的具体细节是不一样的。原创 2023-08-16 21:44:38 · 594 阅读 · 0 评论 -
设计模式之原型模式Prototype的C++实现
设计模型之原型模式C++代码实现。在软件功能设计中,经常面临着“某些结构复杂的对象”的创建工作,且创建的对象想拥有其他对象在某一刻的状态,则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象,并且该对象拥有其他对象在某一刻的状态。上面代码main函数中的创建方式根据实际情况选择,如果想隔离new,则使用方式1。原型模式的优点是将创建对象(该新创建的对象具有其他对象的状态,但与其他对象的地址区域是相互独立的)变得比较简洁。设计产品A,B,这个产品有重量和单价,输出产品的价格。3、原型模式代码实现。原创 2023-08-16 18:56:41 · 700 阅读 · 0 评论 -
设计模式之Bridge模式的C++实现
Bridge模式的C++实现。类实现的功能具有两个变化的维度,甚至由多个维度的变化。Bridge模式使用“对象间的组合关系”解耦抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度变化,即将不同的维度分别进行抽象,然后各自根据变化维度进行继承。Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类甚至由多个变化的维护,这时使用Bridge模式的扩展模式来进行设计代码。原创 2023-08-09 22:38:11 · 751 阅读 · 0 评论 -
装饰模式Decorator介绍与C++实现
装饰模式Decorator介绍与C++代码实现。在软件设计中,如果类的责任划分不清晰,随着需求的增加,过度的使用继承扩展对象的功能,会使得子类极具膨胀,同时充斥者重复代码。装饰模式的目的并非解决“多子类衍生的多继承”问题,装饰模式应用的要点在于解决“主体类在多个方向上的扩展功能”------是为装饰的含义。原创 2023-06-24 17:35:00 · 102 阅读 · 0 评论 -
策略模式Strategy介绍与C++实现
策略模式的介绍和C++实现。定义一系列算法,将它们一个一个都封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定结构)而变化(扩展--->子类化)。即:使用算法的客户程序流程不会随着算法需求的变化而变化,对于算法需求的变化可以在子类中进行适配。(1)策略模式提供了条件判断语句if/switch的另一种实现方法,可以实现多个算法之间的解耦。注意:如果if、switch的条件类型是固定的,不会再扩展的话(eg:if的判断只有5种情况,不会再出现其他情况),则不使用策略类型。原创 2023-06-23 18:06:31 · 461 阅读 · 0 评论 -
单例模式C++实现和观察者模式C++实现
1、单例模式介绍 2、单例代码C++实现 3、观察者模式介绍 4、观察者模式C++代码实现单例实现3种方式(1)懒汉式。(使用时进行实例化。存在线程安全问题)(2)静态局部变量。(使用时进行实例化。不存在线程安全问题)(3)饿汉式。(单例类创建的时候进行实例化。不存在线程安全问题)。static静态成员变量,static类成员变量,static静态成员函数介绍和用法。原创 2023-06-04 18:26:50 · 788 阅读 · 0 评论 -
设计模式之-模板方法模式C++实现与C++模板template用法
设计模式之-模板方法模式C++实现与C++模板使用。模板方法模式使用比较常见,也比较简单,模板方法模式是属于设计模式中的行为设计模式。行为设计模式是关注对象的行为或者交互方面的内容,主要涉及算法和对象之间的职责分配。原创 2023-06-04 10:42:06 · 578 阅读 · 0 评论 -
简单工厂模式与工厂方法模式的C++代码实现
创建型模型设计介绍1、简单工厂模式C++代码实现2、工厂方法模式C++代码实现3、简单工厂模式与工厂方法模式的简单比较原创 2023-05-31 23:27:00 · 246 阅读 · 0 评论 -
C++设计模式介绍、分类与设计模式原则
一、设计模式定义二、设计模式的优点三、设计模式缺点四、设计模式中的抽象思维五、抽象的方法六、设计模式应用场景七、设计模式分类八、设计模式八大原则附加知识(1)C++面向对象三种访问修饰符(2)父类析构函数必须为虚函数(3)override关键字使用(4)final关键字使用(5)父类对象可以与子类对象相互转化吗(6)虚函数、虚函数表介绍原创 2023-05-24 21:48:09 · 1851 阅读 · 1 评论 -
C++线程池介绍和C++代码实现
C++线程池的介绍和使用场景,C++线程池demo实现。原创 2023-05-24 15:40:46 · 1700 阅读 · 0 评论 -
C++ 使用多线程间通信方式模拟消费者生产者模式demo
【代码】C++消费者生产者模式简单demo。原创 2023-05-24 14:22:55 · 173 阅读 · 0 评论