《软件设计师》复习笔记(14.3)——设计模式

目录

一、设计模式分类

1. 创建型模式(Creational Patterns)

2. 结构型模式(Structural Patterns)

3. 行为型模式(Behavioral Patterns)

真题示例: 


一、设计模式分类

  1. 架构模式
    • 高层设计决策(如C/S结构)。
  2. 设计模式
    • 解决重复发生的问题,提供可复用的解决方案。
    • 四要素:模式名称、问题、解决方案、效果。
  3. 惯用法
    • 与编程语言相关的底层模式(如C++的引用计数)。

1. 创建型模式(Creational Patterns)

模式名称(中文)模式名称(英文)定义记忆关键字
抽象工厂模式Abstract Factory提供一个接口,创建一系列相关或相互依赖的对象,无需指定具体类抽象接口
建造者模式Builder将复杂类的表示与构造分离,使相同构建过程能得出不同表示类和构造分离
工厂方法模式Factory Method定义创建对象的接口,由子类决定实例化哪个类(延迟子类实例化)子类决定实例化
原型模式Prototype用原型实例指定创建对象的类型,并通过拷贝创建新对象原型实例,拷贝
单例模式Singleton保证一个类仅有一个实例,并提供全局访问点唯一实例

2. 结构型模式(Structural Patterns)

模式名称(中文)模式名称(英文)定义记忆关键字
适配器模式Adapter将一个类的接口转换成用户希望的另一种接口,使不兼容的接口协同工作转换,兼容接口
桥接模式Bridge将抽象部分与实现部分分离,使它们能独立变化抽象和实现分离
组合模式Composite将对象组合成树形结构表示“整体-部分”层次,用户可一致使用单个/组合对象整体-部分,树形结构
装饰模式Decorator动态地给对象添加额外职责,比继承更灵活附加职责
外观模式Facade为子系统提供统一的高层接口,简化使用对外统一接口
享元模式Flyweight支持大量细粒度对象的共享细粒度,共享
代理模式Proxy为其他对象提供代理以控制访问代理控制

3. 行为型模式(Behavioral Patterns)

模式名称(中文)模式名称(英文)定义记忆关键字
职责链模式Chain of Responsibility通过链式传递请求,减少发送者与接收者耦合,直到有对象处理请求职责链,传递请求
命令模式Command将请求封装为对象,支持参数化、队列、日志和撤销操作日志记录,可撤销
解释器模式Interpreter定义语言的文法表示,并创建解释器来解释句子解释器,虚拟机
迭代器模式Iterator提供顺序访问聚合对象元素的方法,无需暴露内部结构顺序访问,不暴露内部
中介者模式Mediator封装对象间交互,降低耦合,使交互可独立变化不直接引用
备忘录模式Memento在不破坏封装的前提下保存对象状态,后续可恢复保存,恢复
观察者模式Observer定义一对多依赖关系,当对象状态变化时自动通知所有依赖对象通知,自动更新
状态模式State允许对象在内部状态改变时改变行为状态变成类
策略模式Strategy封装一系列算法,使其可互相替换,独立于用户变化算法替换
模板方法模式Template Method定义算法骨架,将某些步骤延迟到子类实现子类重定义步骤
访问者模式Visitor在不改变元素类的前提下定义作用于元素的新操作数据和操作分离

真题示例: 

设计模式描述了一个出现在特定设计语境中的设计再现问题,并为它的解决方案提供了一个经过充分验证的通用方案,不同的设计模式关注解决不同的问题。例如,抽象工厂模式提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类,它是一种(54)模式;(55)模式将类的抽象部分和它的实现部分分离出来,使它们可以独立变化,它属于(56)模式;(57)模式将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作。

(54)A.组合型 B.结构型 C.行为型 D.创建型

(55)A.Bridge B.Proxy C.Prototype D.Adapter

(56)A.组合型 B.结构型 C.行为型 D.创建型

(57)A.Command B.Facade C.Memento D.Visitor

  • 创建型模式主要用于创建对象,抽象工厂模式提供一个接口来创建一系列相关或相互依赖的对象,属于创建型模式。创建型模式关注点在于对象的创建过程和方式,比如单例模式保证一个类仅有一个实例等。
  • Bridge(桥接)模式将类的抽象部分和它的实现部分分离,使它们可以独立变化 。例如在图形绘制系统中,抽象的图形(如圆形、矩形等)和具体的绘制实现(如基于不同绘图库的绘制)可以分别进行扩展和修改。
  • 桥接模式属于结构型模式。结构型模式主要用于处理类或对象的组合,研究如何将类或者对象结合在一起形成更大的结构,比如代理模式、组合模式等也都是结构型模式。
  • Command(命令)模式将一个请求封装为一个对象,这样可以用不同的请求对客户进行参数化,还能将请求排队或记录请求日志,支持可撤销的操作。比如在文本编辑器中,“撤销”操作就可以用命令模式实现,将每次的编辑操作封装成命令对象。

欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形,该绘图软件的扩展性要求将不断扩充新的图形和新的绘图程序,以绘制直线和图形为例,得到如下图所示的类图,该设计采用( )模式将抽象部分与其实现部分分离,使它们都可以独立的变化。其中( )定义了实现类接口,该模式适用于( )的情况,该模式属于( )模式。

A、适配器(adapter) B、装饰(Decorator) C、桥接(Bridge) D、组合(composite)

A、Shape B、Circle和Rectangle C、V1Drawing和V2Drawing D、Drawing

A、不希望在抽象和它的实现部分之间有一个固定判定关系

B、想表示对象的部分 - 整体层次结构.

C、想使用一个已经存在的类,而它的接口不符合要求

D、在不影响其他对象的情况下,以动态透明的方式给单个对象添加职责

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

  • 从类图中可以看出,Shape类代表图形的抽象部分,Drawing类及其子类(V1Drawing、V2Drawing)代表绘制的实现部分,通过将两者分离,使得图形和绘制方式都可以独立变化,符合桥接模式的特点。
  • Drawing类中定义了tdrawLine()和tdrawCircle()等方法,为具体的绘制实现类(V1Drawing、V2Drawing)提供了接口规范,这些具体类需要实现这些方法来完成实际的绘制操作。
  • 桥接模式适用于抽象和实现可以独立发展变化的场景,绘图软件中图形种类和绘图程序都可能不断扩充,即不希望图形抽象和绘制实现之间有固定的绑定关系。
  • 桥接模式是结构型模式,它主要处理对象之间的结构关系,属于结构型对象模式,通过将对象的抽象和实现分离来构建灵活的软件结构。

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

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

相关文章

HarmonyOS:使用Refresh组件实现页面下拉刷新上拉加载更多

一、前言 可以进行页面下拉操作并显示刷新动效的容器组件。 说明 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件从API Version 12开始支持与垂直滚动的Swiper和Web的联动。当Swiper设置loop属性为true时&…

55、⾸屏加载⽩屏怎么进⾏优化

答: (1)使⽤CDN 减⼩代码体积,加快请求速度; (2)SSR通过服务端把所有数据全部渲染完成再返回给客⼾端; (3) 路由懒加载,当⽤⼾访问的时候,再加载相应模块; (4) 使⽤外…

什么是Python单例模式

什么是Python单例模式 Python单例模式是一种创建型设计模式,目的是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。以下从作用和示例进行介绍: 作用 控制资源使用:避免对系统资源的重复消耗,像数据库连接、文件句柄等稀缺资源,只创建一个实例来管理使用,防…

Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇

各位Java开发者们好!🚀 2025年的Java世界正在经历一场前所未有的技术变革。作为深耕Java领域多年的技术博主,今天我将带大家深入探索Java生态即将迎来的5大技术趋势,特别是Kotlin的深度融合和AI技术的新篇章。准备好了吗&#xff…

计算机视觉cv2入门之车牌号码识别

前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识,这里我们以车牌号码识别这一案例来实操一下。 大致思路 车牌号码识别的大致流程可以分为这三步:图像预处理-寻找车牌轮廓-车牌OCR识别 接下来我们按照这三步来进行讲解。 图像预处理 …

CExercise_13_1排序算法_3快速排序算法,包括单向分区以及双向分区

题目: 请手动实现快速排序算法,包括单向分区以及双向分区: // 单向分区快速排序算法 void quick_sort_one_way(int arr[], int len); //双向分区快速排序算法 void quick_sort_two_way(int arr[], int len); 关键点 分析: &#x…

FPGA-VGA

目录 前言 一、VGA是什么? 二、物理接口 三、VGA显示原理 四、VGA时序标准 五、VGA显示参数 六、模块设计 七、波形图设计 八、彩条波形数据 前言 VGA的FPGA驱动 一、VGA是什么? VGA(Video Graphics Array)是IBM于1987年推出的…

Linux和Ubuntu的驱动适配情况

旧 一、Linux Yocto3.0 二、Ubuntu 1.驱动 1.rtc正常 2.led正常 3.加密芯片正常 4.硬件看门狗不行,驱动已经适配好,等硬件修复后,直接使用脚本就可以 5.千兆网口可以,两个百兆网口不行 6.USB上面和下面都可以(插u盘…

Python 文本和字节序列(处理文本文件)

本章将讨论下述话题: 字符、码位和字节表述 bytes、bytearray 和 memoryview 等二进制序列的独特特性 全部 Unicode 和陈旧字符集的编解码器 避免和处理编码错误 处理文本文件的最佳实践 默认编码的陷阱和标准 I/O 的问题 规范化 Unicode 文本,进行安全的…

【Android学习记录】工具使用

文章目录 一. 精准找视图资源ID1. 准备工作2. 使用 uiautomator 工具2.1. 获取设备的窗口内容2.2. Pull XML 文件2.3. 查看 XML 文件 3. 直接使用 ADB 命令4. 使用 Android Studio 的 Layout Inspector总结 二. adb shell dumpsys activity1. 如何使用 ADB 命令2. 输出内容解析…

Kafka系列之:计算kafka集群topic占的存储大小

Kafka系列之:计算kafka集群topic占的存储大小 topic存储数据格式统计topic存储大小定时统计topic存储大小topic存储数据格式 单位是字节大小 size_bytes{directory="/data/datum/kafka/optics-all" } 782336计算topic存储大小脚本逻辑是: 计算指定目录或文件的大小…

C# 高级编程:Lambda 表达式

在 C# 的高级编程中,Lambda 表达式是一个强大而灵活的工具,广泛应用于 LINQ 查询、委托、事件处理以及函数式编程等多个领域。它不仅使代码更简洁、表达更直接,而且在某些场景中能极大提高代码的可读性与可维护性。本文将从 Lambda 表达式的基本语法入手,深入探讨其原理、常…

《软件设计师》复习笔记(11.5)——测试原则、阶段、测试用例设计、调试

目录 1. 测试基础概念 2. 测试方法分类 3. 测试阶段 真题示例: 题目1 题目2 题目3 4. 测试策略 5. 测试用例设计 真题示例: 6. 调试与度量 真题示例: 1. 测试基础概念 定义:系统测试是为发现错误而执行程序的过程&…

方案解读:虚拟电厂标杆项目整体建设方案【附全文阅读】

在电力市场背景下,传统电力现货市场存在电能定价不合理、分布式电源并网困难等问题。本虚拟电厂标杆项目旨在研究全时间尺度虚拟电厂智能管控关键技术,通过研制虚拟电厂控制器样机、开发运行管理平台,实现对分布式能源的合理优化配置。项目内容涵盖虚拟调控、建设目标、建设…

PyTorch 深度学习实战(37):分布式训练(DP/DDP/Deepspeed)实战

在上一篇文章中,我们探讨了混合精度训练与梯度缩放技术。本文将深入介绍分布式训练的三种主流方法:Data Parallel (DP)、Distributed Data Parallel (DDP) 和 DeepSpeed,帮助您掌握大规模模型训练的关键技术。我们将使用PyTorch在CIFAR-10分类…

OpenAI重返巅峰:o3与o4-mini引领AI推理新时代

引言 2025年4月16日,OpenAI发布了全新的o系列推理模型:o3和o4-mini,这两款模型被官方称为“迎今为止最智能、最强大的大语言模型(LLM)”。它们不仅在AI推理能力上实现了质的飞跃,更首次具备了全面的工具使…

【AI插件开发】Notepad++ AI插件开发实践:支持配置界面

一、引用 此前的系列文章已基本完成了Notepad的AI插件的功能开发,但是此前使用的配置为JSON配置文件,不支持界面配置。 本章在此基础上集成支持配置界面,这样不需要手工修改配置文件,直接在界面上操作,方便快捷。 注…

Android12 ServiceManager::addService源码解读

源码 Status ServiceManager::addService(const std::string& name, const sp<IBinder>& binder, bool allowIsolated, int32_t dumpPriority) {auto ctx mAccess->getCallingContext();// apps cannot add servicesif (multiuser_get_app_id(ctx.uid) >…

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案&#xff08;轻量级首选&#xff09; // 创建全局 Context 对象 const GlobalContext createConte…

第四十八篇 电信行业数仓建设实战指南:从架构设计到场景落地

目录 一、云原生架构设计实战1.1 计算存储分离架构搭建1.2 实时离线融合方案 二、维度建模深度解析2.1 电信业务建模方法论2.2 典型模型设计示例 三、ETL流程优化实践3.1 增量同步技术选型3.2 数据清洗规范 四、核心场景实现方案4.1 用户流失预警模型 五、数据治理实施指南5.1 …