C++设计模式

讲起设计模式,首先得谈及面对对象的七个原则

面对对象的七大原则

  1. 开放封闭原则:对扩展开放,对修改关闭,模块应该在尽量不修改源代码的情况下扩展。
  2. 单一职责原则:一个类只做一件事。
  3. 依赖倒换原则:程序要依赖于抽象接口,而不是具体实现,降低客户与实现模块之间的耦合。
  4. 迪米特原则,也称最小知识原则:高内聚,低耦合。
  5. 接口隔离原则:客户端不要依赖它不需要的接口上,类间的依赖关系建立在最小的接口上。
  6. 合成复用原则:尽量使用合成,尽量不要使用继承。
  7. 里氏代换原则:子类不能去修改父类的内容。

面对对象的设计模式

设计模式是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码,让代码更容易让他人理解,提高代码的可靠性。

1. 简单工厂模式

简单工厂模式可根据你参数的不同返回不同类的实例,被创建的实例通常都拥有共同的父类,属于类创建型模式。

主要包含工厂角色、抽象产品角色、具体产品角色

2. 工厂方法模式

在工厂方法模式中,不再提供一个统一的工厂来创建所有对象,而是针对不同的产品提供不同的工厂,系统提供一个和产品等级结构对应的工厂等级结构。工厂方法模式定义一个用于创建对象的接口,由子类决定将哪一个类实例化。

同简单工厂模式,工厂模式引入了一个抽象工厂角色,它可以是接口,也可以抽象类或是具体类。使得系统可以在不修改工厂角色的情况下引入新产品。

设计步骤:

  1. 创建抽象工厂类,定义具体工厂的统一接口;
  2. 创建抽象产品类,定义具体产品的统一接口;
  3. 创建具体产品类(继承抽象产品类);
  4. 创建具体工厂类(继承抽象工厂类);
  5. 外界通过调用具体工厂类的方法,创建具体产品类的实例。

主要优点和缺点 

主要优点:

  1. 用户在使用时只用关心所需产品对应的工厂,无需关心创建细节,甚至无需知道具体产品类的类名。
  2. 基于工厂角色和产品角色的多态性是工厂模式的关键,它能够让工厂自主确定创建何种产品,而如何创建的细节完全封装在具体工厂内部。
  3. 在系统添加新产品时,无需修改抽象产品和抽象工厂提供的接口,无需修改客户端和其他具体工厂和具体对象,只用添加一个具体对象和具体工厂就可以了,系统的可扩展性变得非常好,完全符合“开闭原则”。

主要缺点:

  1. 添加新产品时,需要额外加一个具体产品类和具体工厂类,类的个数成对增加,一定程度上增加了系统的复杂度,会给系统带来一些额外的开销。
  2. 抽象层的使用增加了系统的抽象性和理解难度,且实现时可能用到DOM、反射等技术,增加了系统的实现难度。

适用场景

  1. 客户端不知道它所需要对象的类。只需要知道产品多对应的工厂。
  2. 抽象工厂类通过其子类来指定创建哪个对象。

3. 单例模式

为了确保对象的唯一性,我们可以采用单例模式。

单例模式的特点

  1. 某个类只能有一个实例
  2. 它必须自行创建这个实例
  3. 它必须自行向整个系统提供这个实例

饿汉单例模式

  1. 优点:程序加载就进行实例化,之后的操作效率会很高。
  2. 缺点:由于程序加载就进行实例化,如果后续对此类不进行任何操作,就会导致内存的浪费。

懒汉单例模式

  1. 优点:第一次调用时才进行实例化
  2. 缺点:当多个线程进入时,会创建多个对象。

单例模式的主要优点和缺点

优点

  1. 单例模式提供了对唯一实例的受控访问。
  2. 由于系统只有一个对象,可以节约资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。
  3. 基于单例模式,我们可以进行扩展,指定对象实例的数目。

缺点

  1. 由于单例模式没有抽象层,所以它的扩展有很大的困难。
  2. 单例类的职责过重,一定程度上违背了“单一职责原则”。
  3. 现在很多面对对象的语言都提供了垃圾回收站,因此如果实例的对象长时间不用,系统会认为是垃圾,自动销毁并释放资源,下次使用又重新实例化,这将导致共享的单例对象状态的丢失。

适用场景

  1. 系统只需要实例化一个对象,或者需要考虑资源消耗太大而只允许创建一个对象。
  2. 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。
  3. 典型应用场景,日志文件,网站计数器,应用配置。控制资源的情况下,方便资源之间的互相通信,如线程池,数据库连接池等。

观察者模式

模式动机:建立一套低耦合的消息触发机制。建立对象间一对多的关联关系,并能使一个对象的变化使所有对象感知。每当一个对象状态发生改变,其相关依赖对象皆得到通知并自动更新。

分为观察目标和观察者两个继承层次结构。

观察者模式的优缺点:

优点:

  1. 观察者模式实现表现层和数据逻辑层之间的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得各种各样不同的表现层充当具体观察者角色。
  2. 观察者模式在观察者和观察目标之间建立一个抽象的耦合。
  3. 观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。
  4. 观察者模式满足“开闭原则”的要求,增加新的具体观察者,无需修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。

缺点:

  1. 如果一个观察目标有多个直接和间接观察者,将所有观察者都通知将花费很多时间。
  2. 如果观察者和观察目标之间存在循环依赖,观察目标会触发它们之间的循环调用,可能会导致崩溃。
  3. 观察者模式没有相应的机制让观察者知道所观察的目标是怎么变化的,而仅仅只是知道观察目标发生了变化。

适用场景

  1. 一个抽象模型有两个方面,一个方面依赖另一个方面,将两个方面封装在独立的对象中,使它们可以各自独立的改变和复用。
  2. 一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象发生改变,也不知道这些对象是谁。
  3. 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象......,可以使用观察者模式创建一种链式触发机制。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
目 录 序言 前言 读者指南 第 1 章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第 2 章 实例研究:设计一个文档编辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 272.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor 和 Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory 模式 35 2.6 支持多种窗口系统 35 2.6.1 我们是否可以使用 Abstract Factory 模式 35 2.6.2 封装实现依赖关系 35 2.6.3 Window 和 WindowImp 37 2.6.4 Bridge 模式 40 2.7 用户操作 40 2.7.1 封装一个请求 41 2.7.2 Command 类及其子类 41 2.7.3 撤消和重做 42 2.7.4 命令历史记录 42 2.7.5 Command 模式 44 2.8 拼写检查和断字处理 44 2.8.1 访问分散的信息 44 2.8.2 封装访问和遍历 45 2.8.3 Iterator 类及其子类 46 2.8.4 Iterator 模式 48 2.8.5 遍历和遍历过程中的动作 48 2.8.6 封装分析 48 2.8.7 Visitor 类及其子类 51 2.8.8 Visitor 模式 52 2.9 小结 53 第 3 章 创建型模式 54 3.1 Abstract Factory(抽象工厂)—对象创建型模式 57 3.2 Builder(生成器)—对象创建型模式 633.3 Factory Method(工厂方法)—对象创建型模式 70 3.4 Prototype(原型)—对象创建型模式 87 3.5 Singleton(单件)—对象创建型模式 84 3.6 创建型模式的讨论 89 第 4 章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型模式 92 4.2 Bridge(桥接)—对象结构型模式 100 4.3 Composite(组成)—对象结构型模式 107 4.4 Decorator(装饰)—对象结构型模式 115 4.5 FACADE(外观)—对象结构型模式 121 4.6 Flyweight(享元)—对象结构型模式 128 4.7 Proxy(代理)—对象结构型模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter 与 Bridge 144 4.8.2 Composite、 Decorator 与 Proxy 145 第 5 章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链)—对象行为型模式 147 5.2 COMMAND(命令)—对象行为型模式 154 5.3 INTERPRETER(解释器)—类行为型模式 162 5.4 ITERATOR(迭代器)—对象行为型模式 171 5.5 MEDIATOR(中介者)—对象行为型模式 181 5.6 MEMENTO(备忘录)—对象行为型模式 188 5.7 OBSERVER(观察者)—对象行为型模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型模式 208 5.10 TEMPLATE METHOD(模板方法)—类行为型模式 214 5.11 VISITOR(访问者)—对象行为型模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 5.12.4 对发送者和接收者解耦 229 5.12.5 总结 231 第 6 章 结论 232 6.1 设计模式将带来什么 2326.2 一套通用的设计词汇 23
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。它通常用于解决两个已有接口之间不兼容的问题。 在给出的代码示例中,我们可以看到适配器模式的应用。在Main.cpp文件中,创建了一个Target对象指针target,并将其初始化为Adapter对象。然后调用target的request()函数,实际上调用的是Adapter的request()函数。而Adapter的request()函数内部调用了Adaptee的specificRequest()函数,完成了适配的过程。 在Head.h文件中定义了三个类:Target、Adaptee和Adapter。Target类是适配器模式中的目标接口,定义了一个虚函数request()。Adaptee类是被适配的类,它有一个特殊的请求函数specificRequest()。Adapter类是适配器类,它继承了Target类,并在其request()函数中调用了Adaptee类的specificRequest()函数。 通过适配器模式,我们可以将不兼容的两个接口进行适配,使它们能够协同工作。这在软件开发中经常用于复用已有代码或集成多个系统。 参考: C++设计模式之适配器模式Adapter Head.cpp Main.cpp<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++设计模式之适配器模式(Adapter)](https://download.csdn.net/download/weixin_38666785/12761879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++设计模式-适配器模式](https://blog.csdn.net/qq78442761/article/details/95766831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值