设计模式实现思路介绍

设计模式是在软件工程中用于解决特定问题的典型解决方案。它们是在多年的软件开发实践中总结出来的,并且因其重用性、通用性和高效性而被广泛接受。设计模式通常被分为三种主要类型:创建型、结构型和行为型。


创建型设计模式

创建型设计模式专注于如何创建对象,以确保系统在创建对象时保持灵活性和可扩展性。

  1. 单例模式 (Singleton)

    • 思路:确保类只有一个实例,并提供一个全局访问点。
    • 实现:隐藏构造函数,使用静态方法返回唯一实例。
  2. 工厂方法模式 (Factory Method)

    • 思路:定义一个用于创建对象的接口,让子类决定实例化哪个类。
    • 实现:创建一个抽象方法,由子类实现具体对象的创建。
  3. 抽象工厂模式 (Abstract Factory)

    • 思路:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
    • 实现:定义一个接口用于创建相关的对象家族,具体工厂类实现这个接口。
  4. 建造者模式 (Builder)

    • 思路:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    • 实现:定义一个Builder接口,用于逐步构建复杂对象的各个部分。
  5. 原型模式 (Prototype)

    • 思路:使用已创建的对象作为原型,通过复制这个原型来创建新的对象。
    • 实现:实现克隆(复制)方法,返回对象的一个副本。

结构型设计模式

结构型设计模式处理对象的组合,通常用于实现更大的结构,同时简化结构或提高结构的灵活性。

  1. 适配器模式 (Adapter)

    • 思路:将一个类的接口转换成客户期望的另一个接口。
    • 实现:通过包装一个已存在的类,提供不同的接口。
  2. 桥接模式 (Bridge)

    • 思路:将抽象部分与实现部分分离,使它们可以独立变化。
    • 实现:定义一个抽象类持有一个对实现类的引用,并通过这个引用来调用实现具体行为。
  3. 组合模式 (Composite)

    • 思路:将对象组合成树形结构以表示部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
    • 实现:定义一个包含子部件的组合类,和表示叶节点的类,它们实现相同的接口。
  4. 装饰器模式 (Decorator)

    • 思路:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。
    • 实现:定义装饰类,它包装主类,并在保持主类接口不变的情况下,提供额外的功能。
  5. 外观模式 (Facade)

    • 思路:提供一个统一的接口,用来访问子系统中的一群接口,从而使得子系统更容易使用。
    • 实现:定义一个高层接口,它使得子系统更易于使用。
  6. 享元模式 (Flyweight)

    • 思路:运用共享技术有效地支持大量细粒度的对象。这样可以减少对象的数量,从而减少内存占用和提高性能。
    • 实现:创建一个享元工厂,用于管理共享对象的创建和缓存。确保相同的对象不会被重复创建。
  7. 代理模式 (Proxy)

    • 思路:提供一个替代品或占位符来控制对原对象的访问。代理可以控制对原对象的访问,并允许在将请求传递给原始对象之前或之后进行额外的操作。
    • 实现:定义一个代理类,与原始对象实现相同的接口,并在内部持有原始对象的引用。代理类可以在转发调用前后执行额外的逻辑。

行为型设计模式

行为型设计模式关注对象之间的责任分配。它们处理对象之间的通信,并在对象之间建立清晰的消息传递路径。

  1. 责任链模式 (Chain of Responsibility)

    • 思路:创建对象链,每个对象依次有机会处理请求。如果当前对象无法处理,则它会将请求传递给链上的下一个对象。
    • 实现:定义一个处理请求的接口,并在每个处理类中持有下一个处理对象的引用。请求沿着链传递,直到被处理。
  2. 命令模式 (Command)

    • 思路:将请求封装成对象,从而让你使用不同的请求、队列或日志请求来参数化其他对象。命令模式也支持可撤销的操作。
    • 实现:定义一个命令接口,具体命令实现该接口。调用者持有命令对象,并在适当的时刻执行命令。
  3. 解释器模式 (Interpreter)

    • 思路:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
    • 实现:创建抽象表达式类,具体表达式类实现此接口来解释目标语言。
  4. 迭代器模式 (Iterator)

    • 思路:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
    • 实现:定义迭代器接口,并实现具体迭代器,用于对聚合对象进行遍历。
  5. 中介者模式 (Mediator)

    • 思路:定义一个封装一组对象如何交互的对象。通过使对象明确地不相互引用,并将它们的交互委托给中介者对象,来减少多个对象之间的依赖关系。
    • 实现:创建中介者对象,它通常持有各个对象的引用,并协调它们之间的交互。
  6. 备忘录模式 (Memento)

    • 思路:在不破坏封装性的前提下,捕获并保存一个对象的内部状态,以便在将来可以将对象恢复到这个状态。
    • 实现:创建备忘录对象来存储主要对象的状态,并通过一个管理者来管理备忘录对象。
  7. 观察者模式 (Observer)

    • 思路:定义对象间的一种一对多的依赖关系,以便当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
    • 实现:实现一个主题接口,包含注册、注销和通知观察者的方法。观察者实现一个观察者接口,包含更新方法。当主题状态改变时,通过调用观察者的更新方法来通知所有注册的观察者。
  8. 状态模式 (State)

    • 思路:允许一个对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。
    • 实现:定义状态接口,并为每个具体状态实现该接口。上下文对象根据内部状态的变化切换状态对象,从而改变其行为。
  9. 策略模式 (Strategy)

    • 思路:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。
    • 实现:定义一个策略接口,具体策略类实现这个接口。上下文类持有一个策略对象,客户端可以设置使用哪个策略。
  10. 模板方法模式 (Template Method)

    • 思路:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。
    • 实现:定义一个抽象类,其中包含一个模板方法和一系列抽象方法或钩子方法。子类实现这些方法,模板方法则定义了算法的步骤。
  11. 访问者模式 (Visitor)

    • 思路:表示一个作用于某对象结构中的各元素的操作。访问者模式使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    • 实现:定义一个访问者接口,具体访问者实现这个接口。元素类接受一个访问者对象,并通过调用访问者的访问方法来执行操作。

行为型设计模式通常涉及到算法和对象间的职责分配。这些模式不仅考虑对象本身,还考虑它们之间的交互,以及如何封装并隐藏这些交互的复杂性。


上下文对象模式

这个模式通常是指在程序的不同部分传递包含状态信息的对象。这个上下文对象封装了与请求相关的数据,以避免在方法调用中传递大量参数,或者是为了保持状态以跨多个方法调用。它是一种通过对象来共享数据的方式,使得你可以在程序的不同部分访问和修改这些数据。

在一些框架和库中,上下文对象模式被广泛使用,例如在web开发框架中,请求和响应对象就是上下文对象的实例,它们封装了HTTP请求和响应的所有数据。

与上下文对象模式组合使用的设计模式

上下文对象模式可以与多种设计模式组合使用,具体取决于你的设计需求,例如:

  1. 策略模式(Strategy Pattern): 上下文对象可以保存一个引用到策略对象,并在运行时根据需要切换策略。

  2. 状态模式(State Pattern): 上下文对象可以保存状态,并在其状态改变时改变其行为。

  3. 命令模式(Command Pattern): 上下文对象可以作为命令的一部分,封装所有必要的信息以执行命令。

  4. 观察者模式(Observer Pattern): 上下文对象可以通知一系列观察者对象关于其状态的变化。

  5. 单例模式(Singleton Pattern): 上下文对象本身可能被实现为单例,尤其是在应用全局状态时。

上下文管理器模式

另一个相关的概念是“上下文管理器”模式,这个模式在Python中非常常见,尤其是使用with语句来管理资源的情况。上下文管理器模式确保资源的分配和释放过程是干净的,即使在发生异常时也能保证资源的正确释放。

上下文管理器的例子:

# 使用上下文管理器管理文件资源
with open('file.txt', 'w') as file:file.write('Hello, World!')
# 文件在这个块结束时自动关闭

上下文管理器通常和工厂模式(Factory Pattern)结合使用,工厂负责创建对象,而上下文管理器负责管理对象的生命周期。在Python中,上下文管理器模式是一种特殊的应用方式,它使用with语句来简化资源管理。

综上所述,上下文设计模式指的是一种在程序中传递状态信息的模式,它可以与多种设计模式组合使用,具体取决于你的设计和需求。设计模式不是可以直接复制粘贴到你的代码中的解决方案,而是用于解决特定上下文中的常见问题的模板。在实际应用中,根据具体情况调整和组合这些模式是非常常见的。

学习资源

  • Java版设计模式
  • Go版设计模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线签约如何选择?2024年10款顶级app大比拼

支持电子合同签约的10大app:e签宝、上上签、DocuSign、契约锁、Adobe Sign、法大大、SignNow、安心签、HelloSign、PandaDoc。 无论是企业之间的交易还是个人服务合同,线上电子合同签约提供了一种便捷、高效且安全的方式来处理法律文档。本文将介绍几款优…

RISC-V在当前计算架构中的地位

基于上个视频,我们对RISC-V已经有了一定的了解。这款开源的新生代指令集架构与传统商业指令集架构有很大区别,比如当下最热门的Intel的x86和ARM。这主要体现在以下几个方面: 开放性,任何人与机构都可以具体的应用需求调整和优化R…

【Python实战因果推断】20_线性回归的不合理效果10

目录 Neutral Controls Noise Inducing Control Feature Selection: A Bias-Variance Trade-Off Neutral Controls 现在,您可能已经对回归如何调整混杂变量有了一定的了解。如果您想知道干预 T 对 Y 的影响,同时调整混杂变量 X,您所要做的…

springboot项目怎么样排除自带tomcat容器使用宝蓝德?

前言: 由于Spring Boot 1.x和2.x不兼容,BES提供了对应的Spring Boot Starter版本。 bes‑lite‑spring‑boot‑1.x‑starter.jar,适用于Spring Boot 1.x的版本。 bes‑lite‑spring‑boot‑2.x‑starter…

人工智能对网络安全有何影响?

人工智能网络安全在短期、中期和长期如何变化 当今数字时代网络安全的重要性 在谈论人工智能在网络安全中的作用时,必须首先考虑短期影响,因为它们是最明显的,而且它是一个未知的领域,需要超越直接炒作的能力。 因此&#xff0…

【Altium】AD-在原理图中如何绘制贝塞尔曲线

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 在原理图中绘制贝塞尔曲线的方法 2、 问题场景 贝塞尔曲线主要用来描述各种波形曲线,如正弦、余弦曲线等。贝塞尔曲线的绘制和直线类似,需要固定多个顶点(最少4个)后即…

C++ 的常见算法 之三

C 的常见算法 之三 合并merge使用实列 inplace_merge使用实列 set_difference使用实列 堆make_heap使用实列 sort_heap使用实列 合并 merge 将排序范围 [first1,last1) 和 [first2,last2) 中的元素合并到一个新范围中,该范围从 result 开始,所有元素均…

【常用知识点-Java】创建文件夹

Author:赵志乾 Date:2024-07-04 Declaration:All Right Reserved!!! 1. 简介 java.io.File提供了mkdir()和mkdirs()方法创建文件夹,两者区别:mkdir()仅创建单层文件夹,如…

编程五大原则实现思路介绍

在软件工程中,存在一些被广泛认可的设计原则,它们被称为编程的五大原则,也常被简称为SOLID原则。这些原则旨在促进更好的软件设计,提高可维护性和可扩展性。以下是每个原则的概述以及它们的实现思路: 1. 单一职责原则…

Linux 命令总结

今天,给小伙伴们带来一篇 Linux 命令总结的非常全的文章,也是我们平时工作中使用率非常高的操作命令,命令有点多,建议小伙伴们可以先收藏后阅读。 1.基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmi…

入门PHP就来我这(纯干货)08

~~~~ 有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。 1 PHP对象的高级应用 1.1 final关键字 final 最终的、最后的。被final修饰过的类…

采用B/S模式 可跨平台使用的数据采集监控平台!

数据采集监控平台是一款专注于工业企业生产设备管理、数据采集、数据分析、数据管理、数据存储、数据传输等的软件系统。系统具备丰富的接口,配置灵活,方便部署,通过采集企业生产设备的数据集中处理,将各个信息孤岛有机连接&#…

技术赋能政务服务:VR导视与AI客服在政务大厅的创新应用

在数字化转型的浪潮中,政务大厅作为服务民众的前沿阵地,其服务效率和质量直接影响着政府形象和民众满意度。然而,许多政务大厅仍面临着缺乏智能化导航系统的挑战,这不仅增加了群众的办事难度,也降低了服务效率。维小帮…

ArcEngine获取投影坐标,地理坐标,垂直坐标系统以及3或6分度带的代码

本代码是用于质检中获取图层中平面坐标系统是否采用“2000国家大地坐标系(CGCS2000)高程系统是否采用“1985国家高程基准”。然后封装的一个方法 /// <summary>/// 平面坐标系统是否采用“2000国家大地坐标系(CGCS2000)高程系统是否采用“1985国家高程基准”。/// &l…

Windows的磁盘管理

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 第一动态磁盘管理 问题&#xff1a;…

C语言 求第一天摘的桃子数

猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又吃了一个&#xff0c;第二天早上又将剩下的桃子吃掉一半又多吃了一个&#xff0c;以后每天早上都吃了前一天剩下的一半零一个。到10天早上再想吃时就只剩一个桃子了&#xff0c;求第一天共…

Jackson与Json、Json和各种Java数据类型的互相转化

jackson是什么 json是最常用的数据交换格式 Jackson是最流行的Json库 首先对于这种JSON序列化的库其实有非常多&#xff0c;比如我们熟悉的Gson&#xff0c;Fastjson等等&#xff0c;当然技术没有完全的好坏&#xff0c;但是从使用情况和社区生态等方面综合看来&#xff0c;Ja…

【讲解下AI Native应用中的模型微调】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Jenkins 任务中的 java.lang.InterruptedException 异常解析与解决

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Symfony中的MVC架构实现:构建高效Web应用的基石

Symfony中的MVC架构实现&#xff1a;构建高效Web应用的基石 Symfony是一个高度灵活的PHP框架&#xff0c;用于构建Web应用和API。它遵循模型-视图-控制器&#xff08;Model-View-Controller&#xff0c;简称MVC&#xff09;设计模式&#xff0c;将应用分为三个核心组件&#x…