![](https://img-blog.csdnimg.cn/direct/cd00bcc05062473daad3f9b4b9578e2c.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
设计模式
文章平均质量分 74
C++实现常见的设计模式
ACE叫牌
KEEPING CODING
展开
-
命令模式-C++实现
可以看到,我们先设置命令为打开电灯,按下按钮,电灯已经打开,执行撤销方法,电灯就被关闭,然后我们设置命令为关闭电灯,执行撤销方法,电灯就被打开。4、接口隔离原则:命令模式通过抽象命令和具体命令的设计,可以将不同的请求封装成不同的命令类,从而避免大量的接口在同一个类中定义。1、抽象命令:它定义了执行操作的接口,包含一个执行方法和一个可选的撤销操作,这里的撤销是撤销命令,恢复成上一个命令执行的结果。3、里氏替换原则:命令模式中的具体命令类是抽象命令的子类,因此可以通过具体命令类的替换来扩展和改变命令的行为。原创 2023-12-03 22:11:42 · 1146 阅读 · 2 评论 -
职责链模式-C++实现
将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理请求为止,也就是说如果当前对象不处理请求,那就继续向前传递。2、具体处理者(ConcreteHandler):实现处理请求的接口,处理自己负责的请求,如果自己无法处理,则将请求传递给下一个处理者。1、解耦请求发送者和接收者:请求发送者无需直到具体哪个处理者处理请求,只需要把请求发送给第一个处理者,之后就通过链式传递处理请求。1、无法保证请求一定会被处理:如果职责链上的节点都无法处理这个请求,那么这个请求就会被忽略。原创 2023-12-03 15:51:42 · 502 阅读 · 0 评论 -
迭代器模式-C++实现
在代码中,我们定义了一个Iterator接口,其中包含了Next()和Empty()方法,分别用于获取下一个元素的数据和判断是否还有下一个元素。因为传统的迭代器模式是多态的形式,也就是运行时多态,运行时多态我们需要去访问虚函数表找到要执行的函数地址,在这种情况下当我们的元素有一百万个时,遍历元素就会很慢,完全没必要。测试代码中,我们创建一个聚合对象,并插入了5个元素,然后又创建了一个迭代器的对象,通过迭代器遍历元素并输出。3、抽象聚合对象:定义一个迭代器工厂方法,用于创建一个具体迭代器的实例。原创 2023-12-03 12:47:03 · 540 阅读 · 0 评论 -
组合模式-C++实现
组合模式的核心思想是将对象组织成树状结构,其中单个对象和组合对象都实现了相同的接口或者继承相同的抽象类,这样可以使客户端以递归的方式处理整个对象树,不需要关心处理的节点是叶子节点还是组合节点。1、单一职责原则 (Single Responsibility Principle):文件类只负责输出自己的文件名,目录类负责输出自己的目录名和其子节点的所有名称,即每个类应该只有一个责任。3、对象层次结构的一致性:组合模式让单个对象和组合对象具有相似的操作,使得整个对象层次结构更加统一。测试代码中,我们创建了一个。原创 2023-12-02 23:40:13 · 673 阅读 · 2 评论 -
备忘录模式-C++实现
最后创建了一个备忘录管理者对象,用于管理所有发起人创建的备忘录对象,实现的方法有添加备忘录对象、从备忘录管理列表里取出一个对象。它将对象的内部状态保存到备忘录对象中,并在需要的时候从备忘录中取出恢复状态,实现了状态的保存和恢复。1、状态保存和恢复:备忘录模式可以通过在发起人类和备忘录类之间引入备忘录对象,实现对象状态的保存和恢复。2、简化发起人类:因为备忘录模式可以减轻发起人类的负担,因为它把发起人类的状态保存和恢复委托给了备忘录类和备忘录管理者类,这样使得发起人类更加简单并且易于维护。原创 2023-12-02 15:37:58 · 637 阅读 · 0 评论 -
状态模式-C++实现
根据输出我们可以发现在不同的状态下它们的行为也是不同的,比如在订单待处理状态下:订单可以取消、可以即将处理、但是没有送达;状态模式是一种行为型设计模式,它允许对象内部状态发生改变时改变其行为,它将行为封装在不同的状态对象中,在运行时通过切换不同的状态可以表现出不同的行为。4、提供了一种简洁的方式来配置对象的状态流转:状态模式将对象的状态流转逻辑集中在状态类中,使得状态的变化更加可见和易于管理。2、支持开闭原则:通过添加新的状态类或修改现有状态类的行为,可以方便地扩展和修改对象的行为,而不会影响其他代码。原创 2023-12-01 19:35:54 · 1140 阅读 · 1 评论 -
中介模式-C++实现
中介对象充当了对象间的协调者将对象之间的交互转换为与中介对象的交互,从而降低了对象之间的复杂性。2、中介者对象可能会变得过于“智能”:作为一个统一管理所有对象的管理器,中介者对象需要对所有对象非常了解,从而做出正确的决策,这可能会导致中介者对象变得过于“智能”,代码实现复杂,难以理解和维护。2、增强了系统的可扩展性和灵活性:通过中介者对象,我们可以很灵活的引入一个新的同事类,只需要把它添加到中介者对象维护的一个同事类列表中即可,无需修改现有代码。2、具体中介者:实现抽象中介者定义的接口。原创 2023-12-01 16:57:27 · 433 阅读 · 0 评论 -
适配器模式-C++实现
在类适配器模式中,适配器类即继承目标类,又继承适配者类,从而能够调用适配者类的方法,并将其适配到目标类身上。相比之下,对象适配器更加灵活,因为它是继承目标类、定义适配者对象,在目标类方法中调用适配者对象的方法,这种方法支持我们可以适配多个适配者类(也就是定义多个适配者类),所以更加灵活。2、系统的解耦:适配器模式将客户端和适配者类进行解耦,使得客户端不需要关心具体适配者类的实现细节。2、关系:对象适配器通过持有适配者对象的引用来连接适配器与适配者,类适配器通过同时继承目标类和适配者类来连接适配器与适配者。原创 2023-11-29 23:47:04 · 893 阅读 · 0 评论 -
代理模式-C++实现
5、延迟加载代理:当使用延迟加载代理时,由于需要推迟实际对象的创建或加载,可能会引起一定的性能下降。3、依赖倒置原则:代理模式通过引入抽象的代理接口,将客户端从实际对象解耦,客户端只需要面向代理接口编程,不需要直接依赖实际对象的具体实现。1、单一职责原则:代理模式在客户端和实际对象之间额外增加了一个代理对象,使得代理对象具有更多的责任,而实际对象只需要专注自己的职责即可。客户端方面,我们只需要创建一个代理对象,它会代替真实对象完成功能,客户端就不需要关心真实对象的创建逻辑。还创建了一个中介代理类。原创 2023-11-29 14:30:12 · 666 阅读 · 0 评论 -
门面模式-C++实现
通俗的讲,门面模式就像一个大门,为子系统提供一个进入点。使用门面模式,客户端只需要与门面类交互,而不用直接与子系统的各个组件交互,这样降低了客户端代码与子系统的耦合度。4、依赖倒置原则:门面模式遵循了依赖倒置原则,客户端只依赖于门面类,而不依赖于子系统类,从而减少了客户端与子系统之间的依赖关系,系统的耦合度降低,也提高了系统的灵活性和可扩展性。3、开闭原则:门面模式通过增加门面类中新的方法或扩展子系统类来实现对系统的修改,而只需要对门面类进行修改,不需要对客户端进行修改,从而满足开闭原则。原创 2023-11-28 23:37:35 · 364 阅读 · 0 评论 -
享元模式-C++实现
在某些情况下,一个项目里可能需要创建大量相似的对象,这样对象的一部分是共享的(相同的),还有一部分是个性化(不同的)。3、某些情况下的性能问题:当需要频繁地创建和销毁共享对象时,或者共享对象的数量非常庞大时,共享对象管理的开销可能会超过由于共享而节约的时间。1、共享状态的限制:由于具有相同内部状态的对象是共享的,所以一个对象修改了自己的外部状态之后,会影响到其他的共享对象。2、引入共享管理:由于享元模式引入了共享对象的管理机制,就需要创建一个享元工厂或缓存来管理共享对象的创建和存取,增加了系统的复杂性。原创 2023-11-27 22:31:54 · 504 阅读 · 0 评论 -
单例模式-C++实现
reorder就是在编译器底层进行优化重排指令的执行顺序。举个例子:这行代码在编译器底层大致可以分为三个步骤:1、分配内存2、调用构造器对内存进行初始化3、将内存的地址赋值给m_instance但在实际的运行过程中,编译器执行的顺序可能是1-》3-》2,这就会导致当多个线程同时调用getInstance方法并且m_instance为nullptr时,它们可能会同时通过if语句的判断条件进入临界区。原创 2023-11-27 00:14:11 · 1236 阅读 · 0 评论 -
构建器模式-C++实现
这样,构建器的使用者只需要关注通用接口,而不需要了解具体步骤的实现细节,实现了隔离接口和实现的分离。5、依赖倒置原则(DIP):构建器模式中客户端只需要依赖于通用构建器接口和具体产品的抽象类或接口,而不需要依赖具体的构建器实现或产品类。这样,我们可以方便地扩展构建逻辑而不用影响现有的代码。3、里氏替换原则(LSP):构建器模式中,构建器和具体的产品都是实现同一个接口或抽象类的子类。构建器模式的主要思想是将构建过程拆分为多个步骤来创建一个复杂的对象,通过这种方式,可以灵活地组合步骤,以创建不同的产品。原创 2023-11-21 23:23:31 · 340 阅读 · 1 评论 -
原型模式-C++实现
1、对象克隆可能较为复杂:如果对象内部存在深层次的引用关系,需要保证克隆的完整性,并正确处理对象的引用关系,可能会增加代码的复杂性。我们创建了一个怪兽基类,两个具体的怪兽类,测试代码中我们先是创建了两个不同的原型怪兽类,通过for循环创建大量的怪兽类。在游戏中,需要动态创建大量的怪物对象。1、简化对象创建:原型模式通过复制现有对象来创建新对象,避免了繁琐的初始化过程,使得对象创建变得简单且灵活。5、隐藏实现细节:原型模式隐藏了对象创建的细节,使得客户端无需关注对象的创建过程,只需关注如何获取新的对象。原创 2023-11-21 00:21:10 · 401 阅读 · 0 评论 -
抽象工厂模式-C++实现
我们通过抽象工厂接口创建了一个苹果工厂和华为工厂,又通过华为工厂接口创建了华为电脑和华为手机(苹果同理),这样的话我们就可以使用华为电脑和手机。假设我们有两个产品族:手机(Phone)和电脑(Laptop),它们有不同的型号:苹果(Apple)和华为(HuaWei)。抽象工厂模式是一种创建型设计模式,它提供了一种在不指定具体产品类的情况下创建一系列相关或依赖对象的方法。通过这种方式,我们就绕开了new的方式去创建对象。原创 2023-11-19 21:01:26 · 625 阅读 · 1 评论 -
工厂模式-C++实现
抽象工厂类 IFactory 定义了创建图形对象的抽象接口,具体的工厂类 CircleFactory 和 RectangleFactory 继承自 IFactory,实现了创建图形对象的具体逻辑。工厂模式是一个创建型设计模式,即“对象创建模式”,通过这种模式可以绕开new,来避免对象创建过程中,也就是new的方法造成的紧耦合,从而支持对象创建的稳定。工厂模式中引入了一个工厂类,该工厂负责根据客户端的请求创建相应的对象案例,客户端只需要通过工厂类获取对象,不需要之间调用具体对象的构造函数。原创 2023-11-18 16:48:42 · 87 阅读 · 0 评论 -
桥接模式-C++实现
其中Casa是一个射手,她配备的武器是Pistol,Titan是一个战士,配备的武器是Anchor。我们现在要实现这个需求,只能再加两个类,在构造函数里设置武器和伤害。桥接模式是一种结构型设计模式,它是将抽象部分和实现部分隔离,通过组合关系将抽象部分和实现部分解耦,使它们可以独立变化。并且这样的实现导致我们的测试代码是一种编译时装配,我们希望我们的程序尽可能是运行时装配,这样可以写成“活”的。我们实现了两个类,分别是Casa角色类和Titan角色类,在构造函数里设置角色的武器和伤害,实现了攻击方法。原创 2023-11-18 13:43:29 · 319 阅读 · 0 评论 -
装饰模式-C++实现
在装饰模式下我们可以动态的扩展功能,即添加装饰,比如我们需要添加一个新的小料:牛油果。同时我们为每种饮料提供了两种小料:糖和牛奶,可以根据客人的需要进行添加,其中添加一次糖的价格为1元,牛奶的价格为2元。装饰模式是一种结构型设计模式,也是一种单一职责模式,它允许你在不修改原始类的情况下,通过将对象包装在装饰器的对象中,动态地增加功能和行为。现在我们来分析一下需求,饮品店的饮品就是抽象组件,柠檬水和咖啡是具体组件,因为它们都是饮料这一范畴,牛奶和糖就是具体装饰。,这个指针就需要在我们的具体装饰类里添加。原创 2023-11-16 01:13:32 · 417 阅读 · 0 评论 -
观察者模式-C++
观察者模式(Observer)是一种行为型设计模式,它用于在对象之间建立一对多的依赖关系,当一个对象发生改变时,所有依赖它的对象都会收到通知进行相应的改变。假设现在我们有一个电子商务平台,当用户下单之后我们希望通知库存系统和用户通知系统。在这里面,观察者依赖主题,所以一个主题可以对应多个观察者。原创 2023-11-13 23:51:39 · 423 阅读 · 0 评论 -
策略模式-C++实现
我们定义了一个枚举,里面是各个国家的类型,当我们要按照美国的汇率进行计算时,我们可以通过SetRate方法设置国家类型,再调用Calculate方法进行计算,在这个方法里我们会判断当前是哪个国家,执行对应的算法。比如现在我们要加一个日本的汇率,我们应该在枚举里添加一个日本,在Calculate方法里继续else if执行日本汇率对应的算法。现在我们要添加一个日本的汇率,我们就可以仿照美国、中国、法国的策略类的写法写一个日本的策略类,在运行的时候设置日本的策略类,这样它就会执行日本的算法。原创 2023-11-13 22:43:24 · 1043 阅读 · 0 评论 -
设计模式介绍
以前也学习过设计模式,但是总感觉学不懂,最近开发项目深刻感受到设计模式的重要性,系统学习一些。我是观看油管上李建忠老师的视频学习做的总结,会不断补充,欢迎大家指出错误,学习进步。首先设计模式是在软件开发过程中用于解决特定设计问题的经验总结和最佳实践。它们是一种面向对象设计的指导原则,可帮助开发人员更有效地构建可重用、可维护和可扩展的软件系统。原创 2023-11-12 02:05:33 · 224 阅读 · 0 评论