GOF设计模式中各模式支持的可变方面(封装变化)

news2024/11/16 4:47:40

GOF(Gang of Four)设计模式中,每种模式都旨在解决特定类型的问题,并通过封装变化来提高代码的可维护性和灵活性。以下是各模式支持的可变方面(封装变化)的详细说明:

1. 创建型模式(Creational Patterns)

这类模式关注对象的创建机制,试图封装对象创建过程中的变化。

1.1 单例模式(Singleton Pattern)
  • 封装变化:确保一个类只有一个实例,并提供一个全局访问点。
  • 应用场景:全局配置、日志记录、数据库连接池等。
1.2 工厂方法模式(Factory Method Pattern)
  • 封装变化:将对象的创建延迟到子类中实现。
  • 应用场景:不同产品类型的创建,如图形界面中的按钮、对话框。
1.3 抽象工厂模式(Abstract Factory Pattern)
  • 封装变化:提供一个接口,用于创建一系列相关或依赖的对象,而不指定具体的类。
  • 应用场景:多个产品系列(如不同操作系统下的UI组件)的创建。
1.4 建造者模式(Builder Pattern)
  • 封装变化:将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
  • 应用场景:复杂对象的创建过程,如文档生成、画图算法。
1.5 原型模式(Prototype Pattern)
  • 封装变化:通过克隆现有对象来创建新对象,而不是通过标准构造函数。
  • 应用场景:对象创建成本高、需要避免构造函数调用的情况。

2. 结构型模式(Structural Patterns)

这类模式关注类和对象的组合,通过封装对象之间的组合关系来提高灵活性。

2.1 适配器模式(Adapter Pattern)
  • 封装变化:将一个类的接口转换成客户端期望的另一个接口。
  • 应用场景:使不兼容的接口可以一起工作。
2.2 桥接模式(Bridge Pattern)
  • 封装变化:将抽象部分与实现部分分离,使它们可以独立变化。
  • 应用场景:有两个独立变化维度的系统,如图形编辑器中的形状和颜色。
2.3 组合模式(Composite Pattern)
  • 封装变化:将对象组合成树形结构以表示“部分-整体”的层次结构。
  • 应用场景:处理递归结构的数据,如文件系统、组织结构。
2.4 装饰器模式(Decorator Pattern)
  • 封装变化:动态地给对象添加职责,而不修改其代码。
  • 应用场景:需要在不改变对象结构的情况下扩展其功能。
2.5 外观模式(Facade Pattern)
  • 封装变化:为子系统中的一组接口提供一个统一的接口,简化其使用。
  • 应用场景:简化复杂子系统的使用,如操作系统的API。
2.6 享元模式(Flyweight Pattern)
  • 封装变化:通过共享技术有效地支持大量细粒度的对象。
  • 应用场景:需要大量相似对象,如文本编辑器中的字符渲染。
2.7 代理模式(Proxy Pattern)
  • 封装变化:为其他对象提供一个代理以控制对这个对象的访问。
  • 应用场景:控制对象的访问,如远程代理、虚拟代理。

3. 行为型模式(Behavioral Patterns)

这类模式关注对象之间的职责分配,通过封装对象之间的交互和通信来提高灵活性。

3.1 责任链模式(Chain of Responsibility Pattern)
  • 封装变化:将请求的发送者和接收者解耦,允许多个对象都有机会处理该请求。
  • 应用场景:处理请求的多个处理器,如日志记录、权限检查。
3.2 命令模式(Command Pattern)
  • 封装变化:将请求封装为对象,从而使请求的发送者和接收者解耦。
  • 应用场景:实现撤销、重做、事务处理,如图形界面中的菜单项。
3.3 解释器模式(Interpreter Pattern)
  • 封装变化:定义语言的文法,并提供解释器来解释该语言。
  • 应用场景:解析和执行特定语言的表达式,如SQL查询。
3.4 迭代器模式(Iterator Pattern)
  • 封装变化:提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示。
  • 应用场景:集合类的遍历,如列表、树等。
3.5 中介者模式(Mediator Pattern)
  • 封装变化:用一个中介对象来封装一系列的对象交互,使对象之间不直接相互作用。
  • 应用场景:复杂的对象交互,如聊天室、GUI组件交互。
3.6 备忘录模式(Memento Pattern)
  • 封装变化:在不破坏封装性的前提下,捕获并恢复一个对象的内部状态。
  • 应用场景:实现撤销、重做功能,如文本编辑器的撤销操作。
3.7 观察者模式(Observer Pattern)
  • 封装变化:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都得到通知并自动更新。
  • 应用场景:事件处理系统、数据绑定、发布-订阅系统。
3.8 状态模式(State Pattern)
  • 封装变化:允许对象在其内部状态改变时改变其行为。
  • 应用场景:状态驱动的系统,如有限状态机、工作流系统。
3.9 策略模式(Strategy Pattern)
  • 封装变化:定义一系列算法,并将每个算法封装起来,使它们可以互换。
  • 应用场景:算法选择,如排序、支付方式选择。
3.10 模板方法模式(Template Method Pattern)
  • 封装变化:定义算法的骨架,将某些步骤延迟到子类中实现。
  • 应用场景:算法的固定结构和可变部分,如文档生成、游戏引擎。
3.11 访问者模式(Visitor Pattern)
  • 封装变化:在不改变元素类的前提下定义新的操作。
  • 应用场景:扩展元素类的操作,如编译器中的语法树遍历。

总结

GOF设计模式通过封装变化来提高代码的灵活性和可维护性。每种模式都针对特定类型的变化,提供了相应的解决方案。理解这些模式及其封装的变化方面,可以帮助开发者在面对复杂的设计问题时,选择合适的模式来解决问题。

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

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

相关文章

Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解

title: Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解 date: 2024/11/14 updated: 2024/11/14 author: cmdragon excerpt: schema:beforeWrite 钩子是 Vite 提供的一个功能强大的生命周期钩子,允许开发者在 JSON Schema 被写入之前执行自定义操作。利用这个钩子,您可以…

k8s服务内容滚动升级以及常用命令介绍

查看K8S集群所有的节点信息 kubectl get nodes 删除K8S集群中某个特定节点 kubectl delete nodes/10.0.0.123 获取K8S集群命名空间 kubectl get namespace 获取K8S所有命名空间的那些部署 kubectl get deployment --all-namespaces 创建命名空间 web界面上看到的效果,但是…

MinIo在Ubantu和Java中的整合

1.MinIo在Ubantu中的部署 首先准备好一台已经安装好Ubantu系统的服务器 MinIO是一个开源的对象存储服务器,兼容Amazon S3,性能卓越,适合存储非结构化数据,例如照片、视频、日志文件、备份和容器镜像等。 1:更新系统…

设计模式-参考的雷丰阳老师直播课

一般开发中使用的模式为模版模式策略模式组合,模版用来定义骨架,策略用来实现细节。 模版模式 策略模式 与模版模式特别像,模版模式会定义好步骤定义好框架,策略模式定义小细节 入口类 使用模版模式策略模式开发支付 以上使用…

【LeetCode】【算法】53. 最大子数组和

LeetCode 53. 最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 思路 思路:动态规划秒了 具体递推式如…

供应SW6301V单C口多协议升降压移动电源IC

1. 概述 SW6301V 是一款高集成度的单 C 口多协议升降压移动电源 SOC。集成双向升降压控制器,支持 2~6 节 电池串联,提供 100W 功 率 输 入 输 出 ; 支 持 C 口 快 充 输入输出 ; 支 持UFCS/PPS/PD/SVOOC/VOOC/SCP/FCP/QC/AFC/BC…

C++常用的新特性-->day06

时间间隔duration duration表示一段时间间隔&#xff0c;用来记录时间长度&#xff0c;可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下 // 定义于头文件 <chrono> template<class Rep,class Period std::ratio<1> > class duration;Rep&…

Cyberchef配合Wireshark提取并解析TCP/FTP流量数据包中的文件

前一篇文章中讲述了如何使用cyberchef提取HTTP/TLS数据包中的文件,详见《Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件》,链接这里,本文讲述下如何使用cyberchef提取FTP/TCP数据包中的文件。 FTP 是最为常见的文件传输协议,和HTTP协议不同的是FTP协议传输…

性能面向下一代PCIe Gen 5,G991B322HR、G99L12312HR 安费诺ExtremePort™ Swift连接器支持内部I/O应用

前言 为了在网络设备和服务器上提供更高速度和更小尺寸的解决方案&#xff0c;Amphenol开发了ExtremePort™ Swift连接器&#xff0c;适用于PCIe Gen5 NRZ 32GT/s、UPI 2.0 24GT/s、24Gb/s SAS信号。 G991B322HR G9912312HR G9912322HR G9914312HR G991B312HR G991C312HR G99…

IDEA调整警告级别【IntelliJ IDEA 2024.2.0.1】

文章目录 目前现状鼠标悬停&#xff0c;选择配置筛选 > 取消选择OK效果 目前现状 需要把提示改成只要显示error的5个 鼠标悬停&#xff0c;选择配置 筛选 > 取消选择 OK 效果

【二叉搜素树】——LeetCode二叉树问题集锦:6个实用题目和解题思路

文章目录 计算布尔二叉树的值求根节点到叶节点的数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径 计算布尔二叉树的值 解题思路&#xff1a; 这是一个二叉树的布尔评估问题。树的每个节点包含一个值&#xff0c;其中叶子节点值为 0 或 1&#xff0…

windows下QT5.12.11使用MSVC编译器编译mysql驱动并使用详解

1、下载mysql开发库,后面驱动编译的时候需要引用到,下载地址:mysql开发库下载 2、使用everything搜索:msvc-version.conf,用记事本打开,添加:QMAKE_MSC_VER=1909。不然msvc下的mysql源码加载不上。

Isaac Sim+SKRL机器人并行强化学习

目录 Isaac Sim介绍 OmniIssacGymEnvs安装 SKRL安装与测试 基于UR5的机械臂Reach强化学习测评 机器人控制 OMNI GYM环境编写 SKRL运行文件 训练结果与速度对比 结果分析 运行体验与建议 Isaac Sim介绍 Isaac Sim是英伟达出的一款机器人仿真平台&#xff0c;适用于做机…

删库跑路,启动!

起因&#xff1a;这是一个悲伤的故事&#xff0c;在抓logcat时 device待机自动回根目录了&#xff0c;而题主对当前路径的印象还停留在文件夹下&#xff0c;不小心在根目录执行了rm -rf * … 所以&#xff0c;这是个悲伤的故事&#xff0c;东西全没了…device也黑屏了&#xff…

CSS的综合应用例子(网页制作)

这是html的一些最基本内容的代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <t…

SobarQube实现PDF报告导出

文章目录 前言一、插件配置二、使用步骤1.新生成一个Token2.将拷贝的Token加到上文中执行的命令中3.查看报告 三、友情提示总结 前言 这篇博文是承接此文 .Net项目在Windows中使用sonarqube进行代码质量扫描的详细操作配置 描述如何导出PDF报告 众所周知&#xff0c;导出PDF功…

力扣-Mysql-3328-查找每个州的城市 II(中等)

一、题目来源 3328. 查找每个州的城市 II - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;cities ---------------------- | Column Name | Type | ---------------------- | state | varchar | | city | varchar | ----------------…

curl命令提交大json

有个客户需要提交一个4M左右的pdf&#xff0c;接口里传的是pdf字节流base64编码后的字符串。 直接curl -XPOST -d json串 api接口会报 参数过长报错Argument list too long 网上搜了下解决方案把json串放到文本里然后通过json.txt引入参数 这一试不要紧&#xff0c;差点儿导致…

gitlab和jenkins连接

一&#xff1a;jenkins 配置 安装gitlab插件 生成密钥 id_rsa 要上传到jenkins&#xff0c;id_rsa.pub要上传到gitlab cat /root/.ssh/id_rsa 复制查看的内容 可以看到已经成功创建出来了对于gitlab的认证凭据 二&#xff1a;配置gitlab cat /root/.ssh/id_rsa.pub 复制查…

<项目代码>YOLOv8 玉米地杂草识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…