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

设计模式

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

设计模式

上午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.rhkb.cn/news/395825.html

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

相关文章

Dopple Labs 选择 Zilliz Cloud 作为安全高效的向量数据库

一直以来,我都十分赞同采用通用的标准来评估机器学习领域的技术。向量数据库领域也是如此。Zilliz 发布的性能测试对我有着很大的帮助。 ——Sam Butler Dopple.AI 机器学习总监 01.Dopple AI简介 Dopple Labs Inc. 是 Dopple.AI 的原厂,通过提供创新…

关于进程间通信的练习

1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上 一份 create.c #include<myhead.h>int main(int argc, const char *argv[]) {//创建一个管道文件if(mkfifo("./linux",0664)-1){perror(&qu…

RabbitMQ docker安装

后台配置文件 rabbitmq:image: rabbitmq:latestcontainer_name: rabbitmqports:- "5672:5672" # RabbitMQ server port- "15672:15672" # RabbitMQ management console portenvironment:RABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: admin 若要打…

磁盘无法访问的危机与解救:数之寻软件的数据恢复之旅

在数字时代&#xff0c;磁盘作为数据存储的核心&#xff0c;承载着我们的工作文档、珍贵照片、个人视频等无价之宝。然而&#xff0c;当您试图访问某个磁盘时&#xff0c;却遭遇了“磁盘无法访问”的提示&#xff0c;这无疑是一场突如其来的数据危机。本文将深入探讨磁盘无法访…

【Kubernetes】k8s集群资源调度

目录 一、k8s的List-Watch机制 二、scheduler的调度过程 三、指定节点调度Pod 1.通过nodeName调度Pod 2.通过节点标签选择器调度Pod 3.通过亲和性调度Pod 1&#xff09;节点亲和性 2&#xff09;Pod 亲和性 四、污点(Taint) 和 容忍(Tolerations) 1.污点(Taint) 2.…

运行pytorch报异常处理

一、问题现象及初步定位&#xff1a; 找不到指定的模块。 Error loading "D:\software\python3\Lib\site-packages\torch\lib\fbgemm.dll 此处缺少.dll文件&#xff0c;首先下载文件依赖分析工具 Dependencies https://github.com/lucasg/Dependencies/tree/v1.11.1 之后下…

【大模型学习】多模态大模型进行偏好优化

一、简介 训练模型以理解并预测人类偏好是一项复杂的任务。传统方法如SFT&#xff08;监督微调&#xff09;通常需要较高的成本&#xff0c;因为这些算法需要对数据进行特定标签的标注。偏好优化&#xff08;Preference Optimization&#xff09;作为一种替代方案&#xff0c;…

【多线程-从零开始-捌】阻塞队列,消费者生产者模型

什么是阻塞队列 阻塞队里是在普通的队列&#xff08;先进先出队列&#xff09;基础上&#xff0c;做出了扩充 线程安全 标准库中原有的队列 Queue 和其子类&#xff0c;默认都是线程不安全的 具有阻塞特性 如果队列为空&#xff0c;进行出队列操作&#xff0c;此时就会出现阻…

C++ 重要特性探究

shared_from_this 使用分析 场景 类的成员函数需要获取指向自身的shared_ptr的时候类成员函数传递shared_ptr给其他函数或者对象的时候&#xff0c;目的是为了管理对象生命周期使用方法 首先类必须继承 std::enable_shared_from_this<T>必须使用 shared_from_this 获取指…

智慧交通:将物联网与人工智能完美融合

智慧交通是当今社会面临的一个重要挑战&#xff0c;也是人们生活质量提高的一个重要方面。通过将物联网技术与人工智能相结合&#xff0c;我们能够实现智慧交通系统的全面升级和优化&#xff0c;为人们带来更加便捷、高效和安全的出行体验。 在智慧交通领域&#xff0c;物联网…

电脑图片损坏打不开怎么办?能修复吗?

照片和视频是记录和保存现实生活中的事件的最好方式。由于手机储存空间有限&#xff0c;一般我们会把有纪念意义的照片放到电脑上进行保存&#xff0c;但有时难免会遇到照片被损坏打不开的情况&#xff0c;一旦遇到这种情况&#xff0c;先不要急&#xff0c;也不要因为照片打不…

【智能控制】第7章 神经网络理论基础,神经网络的分类,原理,发展,神经网络学习算法(北京航天航空大学)

目录 第7章 神经网络理论基础 1. 神经网络的发展 2. 神经网络原理 3. 神经网络的分类 (1) 前向网络 (2) 反馈网络 (3) 自组织网络 4. 神经网络学习算法 (1) 智能Hebb学习规则 (2) Delta&#xff08;δ&#xff09;学习规则 5. 神经网络的特征及…

【Mind+】 掌控板入门教程09 魔法之光

光是地球生命的来源&#xff0c;是人类生活的依据&#xff0c;更是人类认识外部世界的工具。在科技发达的今天&#xff0c;我们可以通过传感器来检测光&#xff0c;利用光帮助我们更好的生活。 今天就让我们一起通过几个小项目来感受光的魔法吧。 项目示例 掌控板…

经验是负债,学习是资产

经验是负债&#xff0c;学习是资产 经验是负债&#xff0c;学习是资产。这是李嘉诚先生的一句名言。他一语道出了学习在企业发展中的推动作用。 企业家经营的目的&#xff0c;无非就是将利润最大化。企业能够产生利润&#xff0c;靠的是提升自身业绩、降低运营成本&#xff0c;…

使用 Java Swing 创建一个最大公约数计算器 GUI 应用

使用Java语言,设计一个程序,实现求取两个正整数的最大公约数。 比较基础的一个Java小程序。 1、效果展示 2、程序代码 package demo; import javax.swing.*; import java.awt.*;

Kafka基本讲解

Kafka基本讲解 一&#xff1a;Kafka介绍 Kafka是分布式消息队列&#xff0c;主要设计用于高吞吐量的数据处理和消息传输&#xff0c;适用于日志处理、实时数据管道等场景。Kafka作为实时数仓架构的核心组件&#xff0c;用于收集、缓存和分发实时数据流&#xff0c;支持复杂的…

【博客搭建 第二篇章】项目中怎么引入其他的 icon

一、注册账号并将图标添加到自己的项目中 1、网站地址&#xff1a;https://www.iconfont.cn/ 2、注册 iconfont 账号 3、登录 iconfont 网站中 4、添加图标到购物车中 5、添加图标到项目中 6、生成在线连接 7、复制连接 二、项目中配置连接地址 找到项目中的 them…

R语言医疗数据分析笔记

分组因子又是什么意思&#xff0c;分组因子和数组的区别是什么 举个实际的例子 分组因子 分组因子是分类变量&#xff0c;用于将数据分成不同组以便于比较或分析。例如&#xff0c;在一项研究中&#xff0c;研究对象的性别&#xff08;男性和女性&#xff09;可以视为一个分组…

OBC充电机电力系统的安全保障

OBC&#xff08;On-Board Charger&#xff09;充电机是电动汽车的关键部件&#xff0c;它负责将外部交流电转换为直流电&#xff0c;为电动汽车的动力电池充电。因此&#xff0c;OBC充电机的电力系统安全保障至关重要。 首先&#xff0c;OBC充电机需要有良好的电气隔离和保护功…

【mysql 第三篇章】一条 update语句是怎么持久化到磁盘上的?

首先看一下这个 SQL 语句你会不会写? 下面是说明执行这个 SQL 语句&#xff0c;数据库底层做了什么操作。 update users set namexxx where id10;在引擎要执行更新语句的时候&#xff0c;比如更新 id10 这行数据时&#xff0c;他会先查看数据在缓冲池中是否存在&#xff0c;如…