软件设计中常见的设计模式

2023-09-20 15:08:45

以下是常见的设计模式,并且给出了应用场景:

  1. 工厂模式(Factory Pattern):用于创建对象,隐藏了具体对象的创建细节,客户端只需要通过工厂接口获取对象即可。应用场景包括:当需要根据不同的参数生成不同类型的对象时;当需要遵循“开闭原则”,即增加新类型时,只需要添加新的工厂类。

  2. 单例模式(Singleton Pattern):用于确保一个类只能有一个实例,并提供全局访问点。它通常在需要共享资源、控制资源访问或仅需要一个实例的情况下使用。

  3. 观察者模式(Observer Pattern):定义了一种一对多的依赖关系,当一个对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新。应用场景包括:当需要实现对象间的松耦合关系,而又不希望使用面向对象继承的方式时;当需要实现事件处理机制的时候。

  4. 适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而无法工作的类能够一起工作。应用场景包括:当需要复用一些类,但这些类的接口与你的代码不兼容时;当需要创建一个可重用的类,该类可以与不相关的或者不可预见的类协同工作。

  5. 策略模式(Strategy Pattern):定义了一族算法,并使其相互之间可以互换。它将算法的使用和实现分离,客户端可以灵活地选择不同的策略来完成相同的任务。应用场景包括:当需要定义一些算法,并且希望在运行时动态地选择其中一种算法时;当一个对象有多种行为,可能在不同的场景下使用不同行为时。

  6. 装饰器模式(Decorator Pattern):动态地将责任附加到对象上,扩展对象的功能。它通过创建包装对象来实现,保持接口的一致性。应用场景包括:当需要增强对象的功能,且不希望改变原有的类结构时;当需要给对象添加多个可选的功能时,在不同情况下选择不同的功能组合。

  7. 迭代器模式(Iterator Pattern):提供一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露其内部实现。它将遍历算法与数据结构分离,使得可以独立地改变遍历方式。应用场景包括:当需要对聚合对象进行复杂的遍历时;当需要提供一种通用的遍历方式,而不暴露聚合对象的内部表示时。

  8. 状态模式(State Pattern):允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。它将不同的状态封装成独立的类,使得状态变化时对象的行为更易管理、扩展和维护。应用场景包括:当一个对象的行为取决于它的状态且该状态可能发生改变时;当需要根据不同状态做出不同的响应时。

补充

解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一个语言的文法表示,并且定义了一个解释器来解释该语言中的表达式。该模式主要用于解决某些特定类型的问题,例如编译器、解析器等。

在解释器模式中,通常包含以下几个角色:

  1. 抽象表达式(AbstractExpression):定义一个抽象的接口,用于解释上下文中的表达式。

  2. 终结符表达式(Terminal Expression):实现抽象表达式接口,代表语法中的终结符,进行具体的解释操作。

  3. 非终结符表达式(Non-terminal Expression):实现抽象表达式接口,代表语法中的非终结符,通过递归调用实现对多个终结符的解释操作。

  4. 上下文(Context):包含解释器需要的全局信息,供解释器进行解释操作。

使用解释器模式可以构建一个简单的语言解释器,将复杂的语法规则转化为易于理解和操作的对象。通过添加新的解释器或修改现有的解释器,可以灵活地改变和扩展语言的语法规则。

总结来说,解释器模式通过定义语法规则和对应的解释器,实现了解释和执行特定语言的功能。它可以用于处理一些特定领域的语言解析和执行问题,使得语法规则的改变和扩展更加简单灵活。

更多推荐

面试官:用Vue3.0 写过组件吗?如果想实现一个 Modal你会怎么设计?

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录一、组件设计二、需求分析三、实现流程目录结构组件内容实现API形式事件处理其他完善一、组件设计组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式现在有一个场景,点击新增与编辑都弹框出

linux文件权限

借东风七星坛上卧龙登,一夜东风江水腾。不是孔明施巧计,周郎安得逞才能?基本权限文件权限设置:可以使某个用户或者某个组能够对文件进行某些操作权限对象:u===>属主g===>属组o===>其他人----------------基本权限类型r--->read读--->4w--->write写--->2x--->exec执行

Vue2+Vue3

文章目录Vue快速上手Vue是什么第一个Vue程序插值表达式Vue核心特性:响应式Vue指令v-htmlv-show与v-ifv-else与v-else-ifv-onv-bindv-forv-model指令修饰符计算属性watch侦听器(监视器)watch——简写watch——完整写法Vue生命周期和生命周期的四个阶段

【Linux学习笔记】权限

1.普通用户和root用户权限之间的切换2.权限的三个w2.1.什么是权限(what)2.1.1.用户角色2.1.2.文件属性2.2.怎么操作权限呢?(how)2.2.1.ugo+-rwx方案2.2.2.八进制方案2.2.3.文件权限的初始模样2.2.4.进入一个目录,需要什么权限呢?2.3.为什么要有权限呢?(why

计算机毕业设计 基于SSM+Vue的校园短期闲置资源置换平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟————————————————计算机毕业设计题目《10

强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战

【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现专栏详细介绍:【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现对于深度强化学习这块规划为:基础单智能算法教学(g

01-初识HTML

01-初识HTML学习目标:理解HTML的基本语法掌握排版标签实现标题等效果相对路径和绝对路径媒体标签(图片、音频、视频)超链接一、基础认知了解网页组成和五大浏览器明确Web标准的构成1.1认识网页以下网页有哪些部分组成文字、图片、音频、视频、超链接…那么这个网页背后本质是什么?前端的代码是通过什么软件转换成用户眼中的

高精度地图定位在高速公路自动驾驶系统中的应用

【摘要】自动驾驶已经成为全球汽车产业的战略发展方向,其中L3级高速公路自动驾驶是最有可能率先落地的自动驾驶系统,高精度地图和定位系统是自动驾驶系统的关键一部分,近年来发展迅速,已经达到可量产状态。文章首先分析了自动驾驶和高精度地图定位的发展现状,然后,对高精度地图和定位系统在自动驾驶系统的地理围栏判定和感知冗余方面的应

Linux MQTT智能家居(MQTT框架)

文章目录前言一、MQTT通信框架二、心跳包三、项目中使用到的软件四、MQTT中服务器和客户端建立连接的步骤总结前言本篇文章将会讲解MQTT的框架,我们这个项目使用到的MQTT源码库来自于一位大佬编写。大佬博客主页:主页一、MQTT通信框架MQTT(MessageQueuingTelemetryTransport)是一种

OSI七层网络参考模型与数据流通过程

OSI七层网络参考模型文章目录OSI七层网络参考模型1.OSI参考模型初步了解2.OSI参考模型理解3.数据流通的过程1.OSI参考模型初步了解OSI,英文为OpenSystemInterconnect,意为开放式系统互连,国际化标准组织(ISO)指定了OSI模型,这个模型把网络通信的工作定义成7个框架,分别是物理层,

《java并发编程的艺术》读书笔记 1~2章

1.java并发基本概念1.1上下文切换实现原理:通过CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,时间片非常短,CPU通过不停的切换线程执行,让我们感觉多个线程是同时执行的。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片会切换到下一个任务,并保存上一个任务的状态,下次切换到这个任务时

热文推荐