设计模式实现思路介绍
设计模式是在软件工程中用于解决特定问题的典型解决方案。它们是在多年的软件开发实践中总结出来的,并且因其重用性、通用性和高效性而被广泛接受。设计模式通常被分为三种主要类型:创建型、结构型和行为型。
创建型设计模式
创建型设计模式专注于如何创建对象,以确保系统在创建对象时保持灵活性和可扩展性。
-
单例模式 (Singleton)
- 思路:确保类只有一个实例,并提供一个全局访问点。
- 实现:隐藏构造函数,使用静态方法返回唯一实例。
-
工厂方法模式 (Factory Method)
- 思路:定义一个用于创建对象的接口,让子类决定实例化哪个类。
- 实现:创建一个抽象方法,由子类实现具体对象的创建。
-
抽象工厂模式 (Abstract Factory)
- 思路:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 实现:定义一个接口用于创建相关的对象家族,具体工厂类实现这个接口。
-
建造者模式 (Builder)
- 思路:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 实现:定义一个Builder接口,用于逐步构建复杂对象的各个部分。
-
原型模式 (Prototype)
- 思路:使用已创建的对象作为原型,通过复制这个原型来创建新的对象。
- 实现:实现克隆(复制)方法,返回对象的一个副本。
结构型设计模式
结构型设计模式处理对象的组合,通常用于实现更大的结构,同时简化结构或提高结构的灵活性。
-
适配器模式 (Adapter)
- 思路:将一个类的接口转换成客户期望的另一个接口。
- 实现:通过包装一个已存在的类,提供不同的接口。
-
桥接模式 (Bridge)
- 思路:将抽象部分与实现部分分离,使它们可以独立变化。
- 实现:定义一个抽象类持有一个对实现类的引用,并通过这个引用来调用实现具体行为。
-
组合模式 (Composite)
- 思路:将对象组合成树形结构以表示部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
- 实现:定义一个包含子部件的组合类,和表示叶节点的类,它们实现相同的接口。
-
装饰器模式 (Decorator)
- 思路:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。
- 实现:定义装饰类,它包装主类,并在保持主类接口不变的情况下,提供额外的功能。
-
外观模式 (Facade)
- 思路:提供一个统一的接口,用来访问子系统中的一群接口,从而使得子系统更容易使用。
- 实现:定义一个高层接口,它使得子系统更易于使用。
-
享元模式 (Flyweight)
- 思路:运用共享技术有效地支持大量细粒度的对象。这样可以减少对象的数量,从而减少内存占用和提高性能。
- 实现:创建一个享元工厂,用于管理共享对象的创建和缓存。确保相同的对象不会被重复创建。
-
代理模式 (Proxy)
- 思路:提供一个替代品或占位符来控制对原对象的访问。代理可以控制对原对象的访问,并允许在将请求传递给原始对象之前或之后进行额外的操作。
- 实现:定义一个代理类,与原始对象实现相同的接口,并在内部持有原始对象的引用。代理类可以在转发调用前后执行额外的逻辑。
行为型设计模式
行为型设计模式关注对象之间的责任分配。它们处理对象之间的通信,并在对象之间建立清晰的消息传递路径。
-
责任链模式 (Chain of Responsibility)
- 思路:创建对象链,每个对象依次有机会处理请求。如果当前对象无法处理,则它会将请求传递给链上的下一个对象。
- 实现:定义一个处理请求的接口,并在每个处理类中持有下一个处理对象的引用。请求沿着链传递,直到被处理。
-
命令模式 (Command)
- 思路:将请求封装成对象,从而让你使用不同的请求、队列或日志请求来参数化其他对象。命令模式也支持可撤销的操作。
- 实现:定义一个命令接口,具体命令实现该接口。调用者持有命令对象,并在适当的时刻执行命令。
-
解释器模式 (Interpreter)
- 思路:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
- 实现:创建抽象表达式类,具体表达式类实现此接口来解释目标语言。
-
迭代器模式 (Iterator)
- 思路:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
- 实现:定义迭代器接口,并实现具体迭代器,用于对聚合对象进行遍历。
-
中介者模式 (Mediator)
- 思路:定义一个封装一组对象如何交互的对象。通过使对象明确地不相互引用,并将它们的交互委托给中介者对象,来减少多个对象之间的依赖关系。
- 实现:创建中介者对象,它通常持有各个对象的引用,并协调它们之间的交互。
-
备忘录模式 (Memento)
- 思路:在不破坏封装性的前提下,捕获并保存一个对象的内部状态,以便在将来可以将对象恢复到这个状态。
- 实现:创建备忘录对象来存储主要对象的状态,并通过一个管理者来管理备忘录对象。
-
观察者模式 (Observer)
- 思路:定义对象间的一种一对多的依赖关系,以便当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
- 实现:实现一个主题接口,包含注册、注销和通知观察者的方法。观察者实现一个观察者接口,包含更新方法。当主题状态改变时,通过调用观察者的更新方法来通知所有注册的观察者。
-
状态模式 (State)
- 思路:允许一个对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。
- 实现:定义状态接口,并为每个具体状态实现该接口。上下文对象根据内部状态的变化切换状态对象,从而改变其行为。
-
策略模式 (Strategy)
- 思路:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。
- 实现:定义一个策略接口,具体策略类实现这个接口。上下文类持有一个策略对象,客户端可以设置使用哪个策略。
-
模板方法模式 (Template Method)
- 思路:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。
- 实现:定义一个抽象类,其中包含一个模板方法和一系列抽象方法或钩子方法。子类实现这些方法,模板方法则定义了算法的步骤。
-
访问者模式 (Visitor)
- 思路:表示一个作用于某对象结构中的各元素的操作。访问者模式使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
- 实现:定义一个访问者接口,具体访问者实现这个接口。元素类接受一个访问者对象,并通过调用访问者的访问方法来执行操作。
行为型设计模式通常涉及到算法和对象间的职责分配。这些模式不仅考虑对象本身,还考虑它们之间的交互,以及如何封装并隐藏这些交互的复杂性。
上下文对象模式
这个模式通常是指在程序的不同部分传递包含状态信息的对象。这个上下文对象封装了与请求相关的数据,以避免在方法调用中传递大量参数,或者是为了保持状态以跨多个方法调用。它是一种通过对象来共享数据的方式,使得你可以在程序的不同部分访问和修改这些数据。
在一些框架和库中,上下文对象模式被广泛使用,例如在web开发框架中,请求和响应对象就是上下文对象的实例,它们封装了HTTP请求和响应的所有数据。
与上下文对象模式组合使用的设计模式
上下文对象模式可以与多种设计模式组合使用,具体取决于你的设计需求,例如:
-
策略模式(Strategy Pattern): 上下文对象可以保存一个引用到策略对象,并在运行时根据需要切换策略。
-
状态模式(State Pattern): 上下文对象可以保存状态,并在其状态改变时改变其行为。
-
命令模式(Command Pattern): 上下文对象可以作为命令的一部分,封装所有必要的信息以执行命令。
-
观察者模式(Observer Pattern): 上下文对象可以通知一系列观察者对象关于其状态的变化。
-
单例模式(Singleton Pattern): 上下文对象本身可能被实现为单例,尤其是在应用全局状态时。
上下文管理器模式
另一个相关的概念是“上下文管理器”模式,这个模式在Python中非常常见,尤其是使用with
语句来管理资源的情况。上下文管理器模式确保资源的分配和释放过程是干净的,即使在发生异常时也能保证资源的正确释放。
上下文管理器的例子:
# 使用上下文管理器管理文件资源
with open('file.txt', 'w') as file:file.write('Hello, World!')
# 文件在这个块结束时自动关闭
上下文管理器通常和工厂模式(Factory Pattern)结合使用,工厂负责创建对象,而上下文管理器负责管理对象的生命周期。在Python中,上下文管理器模式是一种特殊的应用方式,它使用with
语句来简化资源管理。
综上所述,上下文设计模式指的是一种在程序中传递状态信息的模式,它可以与多种设计模式组合使用,具体取决于你的设计和需求。设计模式不是可以直接复制粘贴到你的代码中的解决方案,而是用于解决特定上下文中的常见问题的模板。在实际应用中,根据具体情况调整和组合这些模式是非常常见的。
学习资源
- Java版设计模式
- Go版设计模式
相关文章:

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

Node.js学习教程
Node.js学习教程可以从基础到高级,逐步深入理解和掌握这一强大的JavaScript运行环境。以下是一个详细的Node.js学习教程概述,帮助初学者和进阶者更好地学习Node.js。 一、Node.js基础入门 1. 了解Node.js 定义:Node.js是一个基于Chrome V8…...

项目页面优化,我们该怎么做呢?
避免页面卡顿 怎么衡量页面卡顿的情况呢? 失帧和帧率FPS 60Hz就是帧率fps,即一秒钟60帧,换句话说,一秒钟的动画是由60幅静态图片连在一起形成的。 卡了,失帧了,或者掉帧了,一秒钟没有60个画面&…...

【PCIe】P2P DMA
PCIe P2P (peer-to-peer communication)是PCIe的一种特性,它使两个PCIe设备之间可以直接传输数据,而不需要使用主机RAM作为临时存储。如下图3的走向 比如EP1要发送和数据给EP2,操作流程如下: 1. 打开EP1的dma控制器;--client侧 …...

Linux shell编程学习笔记62: top命令 linux下的任务管理器
0 前言 top命令是Unix 和 Linux下常用的性能分析工具,提供了一个动态的、交互式的实时视图,显示系统的整体性能信息,以及正在运行的进程的相关信息,包括各个进程的资源占用状况,类似于Windows的任务管理器。 1 top命令…...

如何在Java中实现高性能的网络通信
如何在Java中实现高性能的网络通信 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 引言 在当今互联网时代,高性能的网络通信是构建大规模分布…...

政务单位网站SSL证书选择策略
在数字化快速发展的今天,政务单位网站作为政府与公众沟通的重要桥梁,其安全性和可信度显得尤为重要。SSL证书作为保障网站安全的重要手段,其选择对于政务单位网站来说至关重要。本文将探讨政务单位网站在选择SSL证书时应该考虑的因素…...

零基础入门 Ai 数据挖掘竞赛-速通 Baseline-1
#AI夏令营 #Datawhale #夏令营 本项目为Datawhale 2024 年 AI 夏令营赛事,零基础入门 AI 数据挖掘竞赛-速通学习手册配套的代码项目。 项目链接:https://aistudio.baidu.com/bd-cpu-02/user/2961857/8113198/home#codelab 任务目标 根据给的test&…...

第二十六章 生成器(generator)(Python)
文章目录 前言一、生成器函数 前言 在 Python 中,使用了 yield 的函数被称为生成器(generator) yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值ÿ…...

Vue通过Key管理状态
Vue通过Key管理状态 Vue 默认按照“就地更新”的策略来更新,通过 v-for 渲染的元素列表。当数据项的顺序改变时,Vue 不会随之移动 DOM 元素的顺序,而是就地更新每个元素,确保它们在原本指定的索引位置上渲染。为了给 Vue 一个提示…...

鸿蒙 HarmonyOs 网络请求 快速入门
官方文档: ArkUI简介-ArkUI(方舟UI框架)-应用框架 | 华为开发者联盟 (huawei.com) 一、通过原有的http组件进行网络请求(方式一) 1.1 HttpRequestOptions的操作 名称类型描述methodRequestMethod请求方式ÿ…...

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)
Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署) 简介 OpenEBS 是一种开源云原生存储解决方案。OpenEBS 可以将 Kubernetes 工作节点可用的任何存储转化为本地或复制的 Kubernetes 持久卷。OpenEBS 帮助应用和平台团队轻松地部署需要…...

如何使用Pip生成requirements.txt文件:全面指南与实践示例
如何使用Pip生成requirements.txt文件:全面指南与实践示例 Python的包管理工具Pip是Python开发中不可或缺的一部分。它不仅可以帮助我们安装和管理Python包,还可以通过生成requirements.txt文件来记录项目所需的所有依赖。本文将详细介绍如何使用Pip生成…...

微信小程序消息通知(一次订阅)
在微信公众平台配置通知模版 通过wx.login获取code发送给后端 let that this // 登陆codewx.login({success: function (res) {if (res.code) {// 发送code到后端换取openid和session_keythat.setData({openCode: res.code})console.log(that.data.openCode, openCode);// 调…...

电传动无杆飞机牵引车交付用户
自2019年起,我们计划做电传动控制,先后做了电传动水泥搅拌罐车罐体控制(国内首创),初步理解了电机控制的特点。 20-21年接着做了10t飞机牵引车控制,还是电液控制联合的,把越野叉车的行驶控制方…...

react框架,使用vite和nextjs构建react项目
react框架 React 是一个用于构建用户界面(UI)的 JavaScript 库,它的本质作用是使用js动态的构建html页面,react的设计初衷就是为了更方便快捷的构建页面,官方并没有规定如何进行路由和数据获取,要构建一个完整的react项目,我们需要…...

Games101学习笔记 Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing)
Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing 一、蒙特卡洛积分 Monte Carlo Integration二、路径追踪 Path tracing1.Whitted-Style Ray Tracings Problems2.只考虑直接光照时3.考虑全局光照①考虑物体的反射光②俄罗斯轮盘赌 RR (得到正确shade函数&#x…...

数据结构概念
文章目录 1. 概念 2. 数据结构和算法的关系 3. 内存 4. 数据的逻辑结构 5. 数据的存储结构 1. 顺序存储结构 2. 链式存储结构 3. 索引存储结构 4. 散列存储结构 6. 数据的运算 1. 概念 定义1(宏观): 数据结构是为了高效访问数据而…...

Windows 下载安装ffmpeg
下载地址 https://ffmpeg.org/download.html 测试 管理员方式打开控制台,输入ffmpeg测试 配置环境变量...

Java AI 编程助手
Java AI 编程助手是指利用人工智能技术来增强和优化Java开发过程中的各种任务和活动。它可以涵盖从代码生成和分析到测试和优化的多个方面,帮助开发人员提高生产效率、降低错误率,并优化代码质量和性能。 ### 功能和特点 1. **智能代码生成和建议**&am…...

day10:01集合
1 作用 Python中的集合(Set)是一个无序的、不包含重复元素的容器。它主要用于去重、成员测试、以及执行数学上的集合运算(如并集、交集、差集和对称差集)等操作。集合的内部实现通常基于哈希表,这提供了快速的成员测试…...

03浅谈提示工程、RAG和微调
03浅谈提示工程、RAG和微调 提示词Prompt Prompt(提示词)是指在使用大模型时,向模型提供的一些指令或问题。这些指令作为模型的输入,引导模型产生所需要的输出。例如,在生成文本时,Prompt可能是一个问题或…...

硅纪元视角 | AI纳米机器人突破癌症治疗,精准打击肿瘤细胞
在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…...

刷代码随想录有感(125):动态规划——最长公共子序列
题干: 代码: class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>>dp(text1.size() 1, vector<int>(text2.size() 1, 0));for(int i 1; i < text1.size(); i){for(int j …...

Linux和mysql中的基础知识
cpu读取的指令大部分在内存中(不考虑缓存) 任何程序在运行之前都的加入到内存。 eip->pc指针,指明当前指令在什么位置。 代码大概率是从上往下执行的,基于这样的基本理论。既可以将一部分指令加载到CPU对应的缓存中…...

ArcGIS Pro SDK (七)编辑 12 编辑模版
ArcGIS Pro SDK (七)编辑 12 编辑模版 文章目录 ArcGIS Pro SDK (七)编辑 12 编辑模版1 在图层上按名称查找编辑模板2 查找属于独立表的表模板3 当前模板4 更改模板的默认编辑工具5 隐藏或显示模板上的编辑工具6 使用图层创建新模…...

数据结构底层之HashMap(面经篇1)
1 . 讲一下hashmap的数据结构 HashMap是一种基于哈希表实现的数据结构,通常用于关联键值对,其中键是唯一的,而值可以重复。在Java中,HashMap是java.util.Map接口的一个实现,它提供了快速的查找、插入和删除操作。 数据…...

昇思学习打卡-6-基于MindSpore的GPT2文本摘要
第一次近距离接触GPT,了解了tokenizers这个分词库,感觉NLP和CV对比起来,处理流程基本一致,都是数据集加载和处理,模型构建、选择学习率、模型训练,进而可以使用模型进行推理。 不同的是,NLP可能…...

代码随想录算法训练营第2天|LeetCode977,209,59
977.有序数组平方 题目链接: 977. 有序数组的平方 - 力扣(LeetCode) 文章讲解:代码随想录 视频讲解: 双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili 第一想法 暴力算法肯定是先将元素…...

Web前端开发——HTML快速入门
HTML:控制网页的结构CSS:控制网页的表现 一、什么是HTML、CSS (1)HTML (HyperText Markup Languaqe:超文本标记语言) 超文本:超越了文本的限制,比普通文本更强大。除了…...