设计模式二十二手
文章平均质量分 53
用通俗的例子讲解设模式
Lemo`s Studio
这个作者很懒,什么都没留下…
展开
-
两种单例模式的区别
然而,在某些特定场景下,可能会有不同的考虑。例如,如果你需要在单例销毁时执行特殊的清理操作或需要在不支持 C++11 的编译器上编译代码,那么传统的单例模式可能会更适合。现代静态变量版的单例模式在大多数情境下都更符合当前的开发需求和标准,推荐优先采用。但在设计模式的选择上仍需根据具体需求和环境进行适当的调整。原创 2024-05-24 15:59:12 · 541 阅读 · 0 评论 -
两段关于回调函数及观察者模式的示例代码
【代码】两段关于回调函数及观察者模式的示例代码。原创 2024-03-19 19:54:00 · 170 阅读 · 0 评论 -
再说对外发布 SDK 中工厂模式的使用
一般而言,当我们使用工厂模式时,通常这么使用:举例示例 1renderer.h#ifndef RENDERER_H#define RENDERER_H#include <string>// An abstract interface for a 3D renderer.class IRenderer {public: virtual ~IRenderer() {} virtual bool LoadScene(const std::string &filename原创 2021-08-11 16:02:50 · 204 阅读 · 0 评论 -
0 引言
设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题。设计模式与方法或库的使用方式不同, 你很难直接在自己的程序中套用某个设计模式。 模式并不是一段特定的代码, 而是解决特定问题的一般性概念。 你可以根据模式来实现符合自己程序实际所需的解决方案。人们常常会混淆模式和算法, 因为两者在概念上都是已知特定问题的典型解决方案。 但算法总是明确定义达成特定目标所需的一系列步骤, 而模式则是对解决方案的更高层次描述。 同一模式在两个不同程序中的实原创 2020-11-11 15:06:47 · 186 阅读 · 0 评论 -
0-1 二十二手设计模式横向对比(C++版)
设计模式 复杂度 流行度 使用示例 识别方法 创建型模式 工厂方法 * *** 工厂方法模式在 C++ 代码中得到了广泛使用。 当你需要在代码中提供高层次的灵活性时, 该模式会非常实用。 工厂方法可通过构建方法来识别, 它会创建具体类的对象, 但以抽象类型或接口的形式返回这些对象。 抽象工厂 ** *** 抽象工厂模式在 C++ 代码中很常见。许多框架和程序库会将它作为扩展和自定义其标准组件的一种方式。 我们可以通过方法.原创 2020-11-25 18:12:16 · 160 阅读 · 0 评论 -
0-2 面向对象设计原则
开闭原则当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。软件实体包括以下几部分:项目中划分出的模块类与接口方法里氏替换原则子类继承父类时,除添加新的方法完成增加功能外,尽量不要重写父类的方法。其定义可总结为:子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法子类中可以增加自己特有的方法当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松当子类的方法实现父类的方法时(重写/重载或..原创 2020-12-15 17:50:18 · 82 阅读 · 1 评论 -
1.1 工厂方法 Virtual Constructor、Factory Method
专业描述 工厂方法模式在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。实现方法:让所有产品都遵循同一接口。 该接口必须声明对所有产品都有意义的方法。在创建类中添加一个空的工厂方法。 该方法的返回类型必须遵循通用的产品接口。在创建者代码中找到对于产品构造函数的所有引用。 将它们依次替换为对于工厂方法的调用, 同时将创建产品的代码移入工厂方法。 你可能需要在工厂方法中添加临时参数来控制返回的产品类型。现在, 为工厂方法中的每种产品编写一个创建者子类, 然后在子类中重写工厂方法, 并原创 2020-11-11 11:31:29 · 194 阅读 · 0 评论 -
1.2 抽象工厂 Abstract Factory
专业描述 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ziQNIMnu-1605066118949)(C:\Users\l00447754\Desktop\design_mode_22th\抽象工厂模式结构.PNG)]实现方法:以不同的产品类型与产品变体为维度绘制矩阵。为所有产品声明抽象产品接口。 然后让所有具体产品类实现这些接口。声明抽象工厂接口, 并且在接口中为所有抽象产品提原创 2020-11-11 11:42:17 · 164 阅读 · 0 评论 -
1.3 生成器 Builder
专业描述 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。生成器模式结构生成器 (Builder) 接口声明在所有类型生成器中通用的产品构造步骤。具体生成器 (Concrete Builders) 提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。产品 (Products) 是最终生成的对象。 由不同生成器构造的产品无需属于同一类层次结构或接口。主管 (Director) 类定义调用构造步骤原创 2020-11-12 11:42:17 · 267 阅读 · 0 评论 -
1.4 原型 Clone、Prototype
专业描述原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。真实世界类比如细胞有丝分裂,会产生一对完全相同的细胞。原始细胞就是一个原型,它在复制体的生成过程中起到推动作用原型模式结构基本实现原型 (Prototype) 接口将对克隆方法进行声明。 在绝大多数情况下, 其中只会有一个名为clone克隆的方法。具体原型 (Concrete Prototype) 类将实现克隆方法。 除了将原始对象的数据复制到克隆体中之外, 该方法有时还需处理克隆过程中的原创 2020-11-24 20:15:19 · 127 阅读 · 0 评论 -
1.5 单例 Singleton
专业描述 单例模式让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。真实世界类比 政府是单例模式的一个很好的示例。 一个国家只有一个官方政府。 不管组成政府的每个人的身份是什么, “某政府” 这一称谓总是鉴别那些掌权者的全局访问节点。实现方法:在类中添加一个私有静态成员变量用于保存单例实例。声明一个公有静态构建方法用于获取单例实例。在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。将类的原创 2020-11-11 11:44:30 · 156 阅读 · 0 评论 -
2.1 适配器 wrapper adapter
专业描述 它能使接口不兼容的对象能够相互合作。真实世界类比 如果你是第一次从美国到欧洲旅行, 那么在给笔记本充电时可能会大吃一惊。 不同国家的电源插头和插座标准不同。 美国插头和德国插座不匹配。 同时提供美国标准插座和欧洲标准插头的电源适配器可以解决你的难题。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wmcHYtBg-1605076371347)(C:\Users\l00447754\Desktop\design_mode_22th\对象适配器模式结构.PNG)]原创 2020-11-11 14:37:15 · 257 阅读 · 0 评论 -
2.2 桥接 Bridge
专业描述 桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。可以这么理解,在实际的程序中, 抽象部分是图形用户界面 (GUI),而实现部分则是底层操作系统代码 (API), GUI 层调用 API 层来对用户的各种操作做出响应。一般来说, 你可以在两个独立方向上扩展这种应用:开发多个不同的 GUI (例如面向普通用户和管理员进行分别配置)支持多个不同的 API (例如, 能够在 Windows、 Linux 和 macOS原创 2020-11-25 16:47:43 · 169 阅读 · 0 评论 -
2.3 组合 Object Tree、Composite
专业描述组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。真实世界类比大部分国家的军队都采用层次结构管理。 每支部队包括几个师, 师由旅构成, 旅由团构成, 团可以继续划分为排。 最后, 每个排由一小队实实在在的士兵组成。 军事命令由最高层下达, 通过每个层级传递, 直到每位士兵都知道自己应该服从的命令。组合模式结构组件 (Component) 接口描述了树中简单项目和复杂项目所共有的操作。叶节点 (Leaf) 是树的基本结构, 它不包含原创 2020-11-26 16:22:50 · 160 阅读 · 0 评论 -
2.4 装饰 Wrapper、Decorator
专业描述 装饰模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。真实世界类比 穿衣服是使用装饰的一个例子。 觉得冷时, 你可以穿一件毛衣。 如果穿毛衣还觉得冷, 你可以再套上一件夹克。 如果遇到下雨, 你还可以再穿一件雨衣。 所有这些衣物都 “扩展” 了你的基本行为, 但它们并不是你的一部分, 如果你不再需要某件衣物, 可以方便地随时脱掉。装饰模式结构部件 (Component) 声明封装器和被封装对象的公用接口。具体部件 (Concrete原创 2020-11-27 16:01:47 · 90 阅读 · 0 评论 -
2.5 外观 Facade
专业描述 外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。真实世界类比 当你通过电话给商店下达订单时, 接线员就是该商店的所有服务和部门的外观。 接线员为你提供了一个同购物系统、 支付网关和各种送货服务进行互动的简单语音接口。外观模式结构外观 (Facade) 提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求, 知晓如何操作一切活动部件。创建附加外观 (Additional Facade) 类可以避免多种不相关的功能污染单一外观, 使其原创 2020-11-27 20:00:36 · 107 阅读 · 0 评论 -
3.2 命令 Action、Transaction、Command
专业描述命令模式是一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。真实世界类比在市中心逛了很久的街后, 你找到了一家不错的餐厅, 坐在了临窗的座位上。 一名友善的服务员走近你, 迅速记下你点的食物, 写在一张纸上。 服务员来到厨房, 把订单贴在墙上。 过了一段时间, 厨师拿到了订单, 他根据订单来准备食物。 厨师将做好的食物和订单一起放在托盘上。 服务员看到托盘后对订单进行检查,原创 2020-11-28 16:07:31 · 477 阅读 · 0 评论 -
3.3 迭代器 Iterator
专业描述迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。真实世界类比你计划在罗马游览数天, 参观所有主要的旅游景点。 但在到达目的地后, 你可能会浪费很多时间绕圈子, 甚至找不到罗马斗兽场在哪里。或者你可以购买一款智能手机上的虚拟导游程序。 这款程序非常智能而且价格不贵, 你想在景点待多久都可以。第三种选择是用部分旅行预算雇佣一位对城市了如指掌的当地向导。 向导能根据你的喜好来安排行程, 为你介绍每个景点并讲述许多激动人心的故事。原创 2020-11-30 11:21:49 · 130 阅读 · 0 评论 -
3.4 中介者 Intermediary、Controller、Mediator
专业描述中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。真实世界类比飞行器驾驶员们在靠近或离开空中管制区域时不会直接相互交流。 但他们会与飞机跑道附近, 塔台中的空管员通话。 如果没有空管员, 驾驶员就需要留意机场附近的所有飞机, 并与数十位飞行员组成的委员会讨论降落顺序。 那恐怕会让飞机坠毁的统计数据一飞冲天吧。塔台无需管制飞行全程, 只需在航站区加强管控即可, 因为该区域的决策参与者数量对于飞行员来说实原创 2020-11-30 16:20:37 · 355 阅读 · 0 评论 -
3.6 观察者 Event-Subscriber、Listener、Observer
专业描述观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。真实世界类比如果你订阅了一份杂志或报纸, 那就不需要再去报摊查询新出版的刊物了。 出版社 (即应用中的 “发布者”) 会在刊物出版后 (甚至提前) 直接将最新一期寄送至你的邮箱中。出版社负责维护订阅者列表, 了解订阅者对哪些刊物感兴趣。 当订阅者希望出版社停止寄送新一期的杂志时, 他们可随时从该列表中退出。观察者模式结构发布者 (Publisher) 会向其他对象发送值原创 2020-12-02 15:11:20 · 502 阅读 · 0 评论 -
3.7 状态 State
专业描述状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。真实世界类比智能手机的按键和开关会根据设备当前状态完成不同行为:当手机处于解锁状态时, 按下按键将执行各种功能。当手机处于锁定状态时, 按下任何按键都将解锁屏幕。当手机电量不足时, 按下任何按键都将显示充电页面。状态模式结构上下文 (Context) 保存了对于一个具体状态对象的引用, 并会将所有与该状态相关的工作委派给它。 上下文通过状态接口与状态对象交互,原创 2020-12-02 17:54:15 · 126 阅读 · 0 评论 -
3.8 策略 strategy
专业描述 它能让你定义一系列算法,并将每种算法分别放在独立的类中,以使算法的对象能够相互替换。真实世界类比 假设你需要前往机场。你可以选择乘坐公共汽车、预约出租车或骑自行车。这就是你的出行策略。你可以根据预算或时间等因素来选择其中一种策略。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vLL89Aig-1605076772105)(C:\Users\l00447754\Desktop\design_mode_22th\策略模式结构.PNG)]实现方法:从上下文类中找原创 2020-11-11 14:40:56 · 224 阅读 · 0 评论 -
3.9 模板方法 Template Method
专业描述模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。真实世界类比模板方法可用于建造大量房屋。 标准房屋建造方案中可提供几个扩展点, 允许潜在房屋业主调整成品房屋的部分细节。每个建造步骤 (例如打地基、 建造框架、 建造墙壁和安装水电管线等) 都能进行微调, 这使得成品房屋会略有不同。模板方法模式结构抽象类 (AbstractClass) 会声明作为算法步骤的方法, 以及依次调用它们的实际模板方法。 算法步骤可以被声明原创 2020-12-03 11:29:58 · 114 阅读 · 0 评论