6.3.面向对象技术-设计模式

news2025/1/10 22:51:15

设计模式

  • 设计模式
    • 创建型模型
      • 速记口诀
    • 结构型设计模式
      • 速记口诀
    • 行为型设计模式
      • 速记口诀
    • 练习题

设计模式

上午2-4分,记忆点很多
在这里插入图片描述
要具体了解推荐看书籍《大话设计模式》
架构模式:软件设计中的高层决策,例如C/S结构就属于架构模式,架构模式反映了开发软件系统过程中所作的基本设计决策。

设计模式:每一个设计模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便的复用成功的的设计和体系结构。四个基本要素:模式名称、问题(应该在何时使用模式)、解决方案(设计的内容)、效果(模式应用的效果)

惯用法:是最低层的模式,关注软件系统的设计与实现,实现时通过某种特定的程序设计语言来描述构件与构件之间的关系。每种编程语言都有它自己特定的模式,即语言的惯用法。例如引用一计数就是C++语言中的一种惯用法。

创建型模型

创建对象

  • 工厂模式(Factory Pattern)
    • 工厂模式就像是一家披萨店。你告诉披萨店你想要什么类型的披萨,它会根据你的需求为你制作披萨。在这里,披萨店就是一个工厂,披萨是工厂创建的产品。
    • 生活中的例子:你在购物时可以使用工厂模式,告诉工厂你需要哪种类型的衣服,然后工厂可以根据你的需求制作并提供相应的衣服。
  • 单例模式(Singleton Pattern)
    • 单例模式确保一个类只有一个实例。这就像一座城市只有一个市长,无论多少人住在这座城市,市长都是唯一的。
    • 生活中的例子:操作系统的任务管理器就是一个单例模式的应用。无论打开多少个任务管理器窗口,它们都指向同一个任务管理器实例。
  • 建造者模式(Builder Pattern)
    • 建造者模式像是建造一座房子。你可以选择房子的类型、颜色、材料等,并由建筑工人按照你的选择来构建房子。
    • 假设你是一位工程师,有一个木制房子构建者和一个砖瓦房子构建者。你的任务是根据客户的要求建造不同类型的房子。客户A需要一座木制房子,你将选择木制房子构建者,然后使用它的方法来逐步构建木制房子,包括设置木质墙壁、建造屋顶和安装窗户。客户B需要一座砖瓦房子,你将选择砖瓦房子构建者,并使用它的方法来逐步构建砖瓦房子,包括砖瓦墙壁、瓦片屋顶和大窗户。
    • 通过构建者模式,你可以根据客户的需求,逐步构建不同类型的房子,而不必亲自处理所有细节。这使得构建过程灵活且回维护,同时允许创建不同风格和材质的房子
  • 原型模式(Prototype Pattern):
    • 原型模式通过复制现有对像来创建新对象。这就像使用3D打印机复制一件艺术品或零件,从一个原型创建多个相同的物品。
    • 生活中的例子:在电影制作中,制作人可以使用原型模式来复制特效道具,以便在不同场景中使用多个相同的道具。

速记口诀

速记口诀:单抽元件厂

创建型设计模式定义记忆关键字
Abstract Factory
抽象工厂模式
提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类抽象接口
Builder
构建器模式
将一个复杂类的表示与其构造相分离,使得相类和构造分离同的构建过程能够得出不同的表示类和构造分离
Factory Method
工厂方法模式
定义一个创建对象的接口,但由子类决定需要实例化哪一个类。使得子类实例化过程推迟子类决定实例化
Prototype
原型模式
用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象原型实例,拷贝
Singleton
单例模式
保证一个类只有一个实例,并提供一个访问它的全局访问点唯一实例

结构型设计模式

结构型设计模式:关注如何将对象和类组合成更大的结构,以便更好地实现系统的整体结构。这些模式有助于解决对象之间的组合、接口和继承等关系,从而提高代码的可扩展性和可维护性

  • 适配器模式(Adapter Pattern):
    • 适配器模式允许两个不兼容的接口协同工作。就像使用电源适配器将外国电器插头适到国内插座一样,适配器模式可以使不同的类一起工作。
    • 生活中的例子:
      想象你有一台笔记本电脑,但只有一个USB-C接口,而你的打印机只支持USB-A接口。你可以使用USB-C到USB-A的适器,使两者兼容。
  • 桥接模式(Bridge Pattern))
    • 桥接模式分离了一个对象的抽象部分和具体部分,使它们可以独立地变化。这个模式就像一座桥,将两个独立的领域连接起来。
    • 生活中的例子:
      想象你有一辆汽车,汽车的品牌(如奥迪、宝马)和颜色(如红色、蓝色)是两个独立的变化维度。桥接模式允许你将品牌和颜色抽象出来,使你可以轻松地组合不同品牌和颜色,例如创建一个红色的奥迪或蓝色的宝马。
  • 组合模式(Composite Pattern):
    • 组合模式允许将对象组织成树状结构,使单个对象和组合对象都可以一致地对待。这就像将多个文件夹和文件组织成文件系统树一样。
    • 生活中的例子:
      在操作系统中,文件夹可以包含文件和其他文件夹,创建了一个树状的组织结构,你可以对文件夹和文件执行相似的操作,如复制、删除等。
  • 装饰器模式(Decorator Pattern):
    • 装饰器模式允许动态地为对象添加新的功能,而无需修改其源代码。这就像在你的家中不断地添加新的家具或装饰来改善它的外观和功能。
    • 生活中的例子:
      如果你有一台智能音响,可以通过添加新的语音助手技能(如天气查询或音乐播放)来扩展其功能,而不需要改变音响的核心设计。
  • 外观模式(Facade Pattern):
    • 外观模式提供了一个简化的接口,用于访问复杂系统中的一组接口。这个模式就像建筑物的外立面,隐藏了建筑内部复杂的结构,使外部用户可以轻松访问。
    • 生活中的例子:
      在计算机操作系统中,你通常使用一个图形用户界面(GUI),它提供了一个易于使用的外观,隐藏了底层操作系统的复杂性。你可以点击图标、打开应用程序,而无需了解操作系统的内部工作原理。
      就像小米有很多智能产品,可以通过米家app进行管理
  • 享元模式(Flyweight Pattern):
    • 享元模式旨在最小化内存或计算开销,通过共享尽可能多的相似对象来实现。这就像在共享办公空间中租用一个工作区,多个人可以共享同一空间,减少了资源浪费。
    • 生活中的例子:
      在图像编辑软件中,当多个图像元素共享相同的颜色或图案时,可以使用享元模式来减少内存占用。相同的颜色或图案可以被多个图像元素引用,而不是为每个元素都存储一份相同的数据。
  • 代理模式(Proxy Pattern):
    • 代理模式允许一个对象代表另一个对象进行控制访问。就像你聘请一个房产经纪人代表你购买房产,代理模式可以控制对另一个对象的访问。
    • 生活中的例子:
      在计算机网络中,代理服务器充当客户端和目标服务器之间的中间层,用于缓存、过滤或加速请求,以提供更好的访问控制和性能。

速记口诀

速记口诀:外侨组员带配饰

结构型设计模式定义记忆关键字
Adapter
适配器模式
将一个类的接口转换成用户希望得到的另一种接口。它使原本不相容的接口得以协同工作转换,兼容接口
Bridge
桥接模式
将类的抽象部分和它的实现部分分离开来,使它们可以独立的变化抽象和实现分离
Composite
组合模式
将对象组合成树型结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一 致性整体-部分,树形结构
Decorator
装饰模式
动态的给一个对象添加一些额外的职责。它提供了用子类扩展功能的一个灵活的替代,比派生一个子类更加灵活附加职责
Façade
外观模式
定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了该子系统的使用对外统一接口
Flyweight
享元模式
提供支持大量细粒度对象共享的有效方法细粒度,共享
Proxy
代理模式
为其他对象提供一种代理以控制这个对象的访问代理控制

行为型设计模式

行为型设计模式:关注对象之间的通信、职责分配和算法的交互方式,它们帮助我们更好地管理对象之间的关系,使系统更具灵活性机可维护性

  • 责任链模式(Chain of Responsibility Pattern):
    • 责任链模式就像是传递请求。多个对象依次尝试处理请求,直到有一个对象能够处理为止。
    • 生活中的例子:在组织中,员工的请假申请可能需要经过多个级别的审批,每个级别的主管可以决定是否批准请假。
  • 命令模式(Command Pattern):
    • 命令模式就像使用遥控器来控制设备。你将命令封装在遥控器按钮中,然后可以随时执行命令。
    • 生活中的例子:电视遥控器是命令模式的经典示例。你可以使用遥控器来执行命令,如打开电视、切换频道或调整音量。
  • 解释器模式(Interpreter Pattern):
    • 解释器模式用于处理语言解释和编译器等领域,它定义了一种语言的语法表示,并提供了解释器来解释这种语法。
    • 生活中的例子:在编程中,正则表达式就是解释器模式的一个实例,用于匹配和解释字符串模式。
  • 迭代器模式(Iterator Pattern):
    • 迭代器模式就像是遍历集合。它提供了一种顺序访问集合元素的方法,而无需暴露集合的内部结构。
    • 生活中的例子:在编程中,你可以使用迭代器来遍历数组、列表或集合中的元素,而无需知道底层数据结构。
  • 中介者模式(Mediator Pattern):
    • 中介者模式就像是一个中间人协调多个对象之间的交互。它减少了对象之间的直接通信,降低了耦合度。
    • 生活中的例子:在一个团队中,项目经理可以充当中介者,协调团队成员之间的合作和沟通,以确保项目的顺利进行。
  • 备忘录模式(Memento Pattern):
    • 备忘录模式就像是保存和还原状态。它允许你保存对象的状态,以便将来可以还原到先前的状态。
    • 生活中的例子:在文本编辑器中,你可以使用撤销和重做功能,这就是备忘录模式的应用。你可以撤销到之前的状态,然后再次重做。
  • 观察者模式(Observer Pattern):
    • 观察者模式就像订阅通知。多个观察者(订阅者)订阅主题(发布者),当主题有新信息时,观察者会自动接收通知。
    • 生活中的例子:许多社交媒体平台使用观察者模式,当你关注某个用户或主题时,系统会将他们的更新信息发送给你。
  • 状态模式(State Pattern):
    • 状态模式就像人的不同情绪状态。你可以处于高兴、生气或伤心等不同的状态,每种状态下的行为可能不同。
    • 生活中的例子:在自动售货机中,售货机可能有不同的状态,如待机、售卖中、缺货等。每种状态下,售货机的行为都不同。
  • 策略模式(Strategy Pattern):
    • 策略模式就像选择不同的解决方案来解决同一个问题。你可以根据情况选择不同的策略,以实现相同的目标。
    • 生活中的例子:在旅行规划中,你可以选择不同的交通工具(策略),如汽车、火车或飞机,来达到相同的目的地。
  • 模板方法模式(Template Method Pattern):
    • 模板方法模式就像是定义了一个算法的框架,但允许子类实现其中的一些步骤。
    • 生活中的例子:在烹饪中,制作一道菜的过程可能包括一些固定的步骤,如准备、烹饪和装盘,但每道菜的具体步骤和材料可能不同。
  • 访问者模式(Visitor Pattern):
    • 访问者模式就像是访问不同类型的元素。你可以定义不同的访问者来执行不同类型元素的操作。
    • 生活中的例子:在图书馆中,你可能有不同类型的书籍,如小说、科普书和艺术书。不同类型的书籍可能需要不同类型的读者来浏览和理解。

速记口诀

速记口诀:观摩(模)对(迭)策,责令解放(访),戒(介)忘台(态)

行为型设计模式定义记忆关键字
Chain of Responsibility
职责链模式
通过给多个对象处理请求的机会,减少请求的发送者与接收者之间的耦合。将接收对象链接起来,在链中传递请求,直到有一个对象处理这个请求传递请求、职责, 链接
Command
命令模式
将一个请求封装为一个对象,从而可用不同的请求对 客户进行参数化,将请求排队或记录请求日志,支持 可撤销的操作日志记录、可撤销
Interpreter
解释器模式
给定一种语言,定义它的文法表示,并定义一个解释 器,该解释器用来根据文法表示来解释语言中的句子解释器,虚拟机
Iterator
迭代器模式
提供一种方法来顺序访问一个聚合对象中的各个元素而不需要暴露该对象的内部表示顺序访问,不暴露内部
Mediator
中介者模式
用一个中介对象来封装一系列的对象交互。它使各对象不需要显式地相互调用,从而达到低耦合,还可以独立的改变对象间的交互不直接引用
Memento
备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将该对象恢复到原先保存的状态保存,恢复
Observer
观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新通知、自动更新
State
状态模式
允许一个对象在其内部状态改变时改变它的行为状态变成类
Strategy
策略模式
定义一系列算法,把它们一个个封装起来,并且使它们之间可互相替换,从而让算法可以独立于使用它的用户而变化算法替换
Template Method
模板方法模式
定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤
Visitor
访问者模式
表示一个作用于某对象结构中的各元素的操作,使得在不改变各元素的类的前提下定义作用于这些元素的新操数据和操作分离

练习题

【2014】下图所示为(44)设计模式,适用于(45)。
在这里插入图片描述
(44)
A.适配器(Adapter)
B.责任链(Chain of Responsibility)
C.外观(Facade)
D.桥接(Bridge)

(45)
A.有多个对象可以处理一个请求,在运行时刻自动确定由哪个对象处理
B.想使用一个已经存在的类,而其接口不符合要求
C.类的抽象和其实现之间不希望有一个固定的绑定关系
D.需要为一个复杂子系统提供一个简单接口

答案C D

【2014】下图所示为()设计模式,适用于()。
在这里插入图片描述
A.抽象工厂(Abstract Factory)
B.生成器(Builder)
C.工厂方法(Factory Method)
D.原型(Prototype)

A.一个系统要由多个产品系列中的一个来配置时
B.当一个类希望由它的子类来指定它所创建的对象时
C.当创建复杂对象的算法应该独立于该对象的组成部分及其装配方式时
D.当一个系统应该独立于它的产品创建、构成和表示时

答案B C

【2015】(45)设计模式能够动态地给一个对象添加一些额外的职责而无需修改此对象的结构;(46)设计模式定义一个用于创建对象的接口,让子类决定实例化哪一个类;欲使一个后端数据模型能够被多个前端用户界面连接,采用(47)模式最适合。
(45)
A.组合(Composite)
B.外观(Facade)
C.享元(Flyweight)
D.装饰器(Decorator)

(46)
A.工厂方法(Factory Method)
B.享元(Flyweight)
C.观察者(Observer)
D.中介者(Mediator)

(47)
A.装饰器(Decorator)
B.享元(Flyweight)
C.观察者(Observer)
D.中介者(Mediator)

答案D A D

【2021】股票交易中,股票代理(Broker)根据客户发出的股票操作指示进行股票的买卖操作,设计如下所示类图。该设计采用()模式将一个请求封装为一个对象,从而使得以用不同的请求对客户进行参数化;
对请求排队或记录请求日志,以及支持可撤销的操作,其中,()声明执行操作的接口。该模式属于()模式,该模式适用于()
在这里插入图片描述

(A)命令(Command)
(B)观察者(Observer)
(C 状态(State)
(D)中介者(Mediator)

(A) Operation
(B) sellOperation/BayOperation/ViewOperation
(C Broker
(D) Stock

(A)结构类型
(B)结构型对象
(C 创建类型
(D)行为型对象

(A)一个对象必须通知其他对象,而它又不能假定其他对象是谁
(B)抽象出需要执行的动作以参数化某对象
(C 一个对象的行为决定于其状态且必须在运行时刻根据状态改变行为
(D)一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象

答案 A A D B

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

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

相关文章

赛盈分销亮相AI科技大会暨亚马逊新增长大会,与企业共话跨境品牌发展新机遇!

八月开端,由知无不言与xmars和钱老师课堂联合主办的2024年AI科技大会暨亚马逊新增长大会在深圳宝安顺利开展,为期2天的跨境峰会吸引了上千位优秀的卖家朋友前来感受一场盛夏大狂欢。在本次跨境峰会里,邀请了多位不同领域的先锋人物&#xff0…

在国产芯片上实现YOLOv5/v8图像AI识别-【2.4】导出RKNN模型(第一部分:模型修改)更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 基础…

挖矿木马攻破了服务器

最近被国外的挖矿木马攻破了服务器 根据非法登录,用 #last指令查看登录ip 首先删掉登录主机 #kill -9 pts/0 第二步 #top 看看什么占用cpu高 第三步杀死狂刷CPU的服务 过一分钟后,服务又开始狂刷cpu。 第四步根据pid查到服务地址 #systemctl status…

frameworks 之ServiceManager

frameworks 之ServiceManager 解析启动入口启动AIDL实现类客户端Bp发送讲解1. 获取 BpServiceManager创建代理类 ServiceManagerShim 返回调用对应AIDL方法调用驱动通知 服务端Bn接收讲解注册Binder回调监听Binder消息处理 备注 ServiceManager 作为android中的路由器提供服务注…

正则表达式扩展应用

使用扩展正则表达式 egrep 首先来看一条前面章节学习过的用来去除空白行和注释行的指令: grep -v ^$ regular_express.txt |grep -v ^# 可见,通常的 grep 指令需要使用两次管线命令。那么如果使用扩展正则表达式,则可以简化为:…

4K YouTube to MP3 Pro:跨平台音频提取与转换的好用工具

4K YouTube to MP3 Pro是一款专为追求高品质音频体验的用户设计的跨平台(支持Mac与Windows)音频提取与转换软件。该软件以其卓越的音频提取能力和简便的操作流程,在同类产品中脱颖而出,成为众多用户的心头好。 功能强大&#xff…

股吧评论自动采集工具推荐,一学就会

股市波动无常,股民情绪更是难以捉摸。但想象一下,如果能即时掌握东方财富网股吧里股民的热议话题与情绪倾向,那将对您的投资决策带来怎样的影响?本文将为您揭晓一款易于上手的股民评论自动采集工具,助您把握市场脉搏&a…

钉耙编程(5)

1008 猫咪们狂欢 分析&#xff1a; 会创建一个二分图 代码&#xff1a; #include <bits/stdc.h> #define ll long long #define INF 1e9 using namespace std; const int N10005; const int M100010; struct edge{ll v,c,ne; }e[M]; int h[N],idx1; int d[N],cur[N]; …

武汉流星汇聚:跨境电商行业的快速崛起者,以实力与口碑铸就辉煌

在跨境电商这片充满机遇与挑战的蓝海中&#xff0c;武汉流星汇聚电子商务有限公司如同一颗迅速升起的新星&#xff0c;以其独特的经营模式、专业的服务团队和卓越的业绩表现&#xff0c;在短短几年内实现了跨越式的发展&#xff0c;成为了业界内外瞩目的焦点。 自2019年成立以…

【重要通知】关于公众号、淘宝店铺、CSDN等平台更名的公告

尊敬的粉丝/用户朋友们&#xff1a; 您们好&#xff01; 感谢您一直以来对我们平台的支持与信任&#xff01;由于我们已经取得了作品登记证书&#xff0c;平台的名称和登记证书著作权人名称不一致&#xff0c;在打击盗版、防伪标识方面&#xff0c;对我们造成了一定的困扰 &am…

【漏洞复现】某赛通数据泄露防护(DLP)系统 NetSecConfigAjax SQL注入漏洞

0x01 产品简介 某赛通新一代数据泄露防护系统&#xff08;简称 DLP&#xff09;&#xff0c;以服务企事业单位进行数据资产梳理、数据安全防护为目标。系统采用平台化管理&#xff0c;将终端DLP、网络DLP、邮件DLP、存储扫描DLP、API 接口DLP 进行统一管理&#xff0c;模块化控…

共话肿瘤免疫壮丽里程 —— I-O Asia亚洲肿瘤诊疗与药物创新峰会9月广州启程

在2024年的今天&#xff0c;癌症的阴影依然笼罩着全球&#xff0c;它以其无声的侵袭&#xff0c;成为威胁人类健康的隐形杀手。根据国际癌症研究机构&#xff08;IARC&#xff09;的最新数据&#xff0c;全球癌症的发病率持续上升&#xff0c;预计在未来几年内&#xff0c;新发…

事务性邮件接口API如何集成以实现自动化?

事务性邮件接口API有哪些优势&#xff1f;邮件接口API集成方法&#xff1f; 通过集成事务性邮件接口API&#xff0c;企业可以实现邮件发送的自动化&#xff0c;提高效率&#xff0c;增强用户体验。AokSend将探讨如何集成事务性邮件接口API以实现自动化&#xff0c;并提供一些最…

仓储物流管理系统是什么?

仓储物流管理系统&#xff08;Warehouse Management System, WMS&#xff09;是一种专门设计用于管理和优化仓库操作的先进软件解决方案。这类系统的主要目的在于帮助企业在其仓库内更加高效地处理货物的接收、存储、拣选、包装及最终发货等一系列复杂的流程。以下是一些该系统…

Python 爬取网页水务数据并实现智慧水务前端可视化

提示&#xff1a;本文爬取深圳市环境水务集团有限公司的公开数据作为数据样例进行数据分析与可视化。 文章目录 一、爬虫二、对爬取的数据进行数据库、excel的存储与数据处理1.代码实现 三、应用Flask框架将后端获取数据后渲染到前端四、前端Echarts的使用1.下载echarts.min.js…

RHCA III之路---EX436-10

RHCA III之路---EX436-10 1. 题目2. 解题3. 验证 1. 题目 2. 解题 nodea上执行 pcs constraint location cluster436 prefers nodeb.private.example.com pcs constraint location cluster436 avoids nodea.private.example.com3. 验证 pcs resource curl 172.25.250.80

SAP通过代码函数创建定制/工作台/副本请求创建

注意事项&#xff1a;会跟标准的一样创建完毕会跳出来框框 DATA iv_new_request_type TYPE e070-trfunction. DATA es_new_request TYPE trwbo_request_header. DATA et_new_tasks TYPE trwbo_request_headers. DATA ev_request_changed LIKE trpari-w_v…

Nginx 学习总结

Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。 一、Nginx的特点 高性能&#xff1a;Nginx使用事件驱动模型&#xff0c;可以同时处理大量的并发连接&#xff0c;而且在高负载和大流量情况下仍然能够保持良好的性能。官方测试能够…

音乐格式amr如何转换为mp3?新手小白也能学会的音频格式转换方法!

按照现在的技术发展&#xff0c;这绝对不是什么复杂的问题。现在市面上有很多简易的转换工具可以解决&#xff0c;无需学习成本&#xff0c;0基础就能学会并解决&#xff01; 更多了解&#xff1a;牛学长转码大师 大家在办公中可以应用到的文件格式越来越多了&#xff0c;利用不…

【数据结构】哈希应用-海量数据处理

目录 1、10亿个整数里面求最大的100个 2、求大文件交集 3、查找出现次数前210的ip地址 1、10亿个整数里面求最大的100个 经典的tok问题&#xff0c;可以使用堆来解决 2、求大文件交集 给两个文件&#xff0c;分别有100亿个query&#xff0c;我们只有1G内存&#xff0c;如…