整理好了!2024年最常见 20 道设计模式面试题(六)

上一篇地址:整理好了!2024年最常见 20 道设计模式面试题(五)-CSDN博客

十一、组合模式是如何用于树形结构的?

组合模式(Composite Pattern)是一种结构设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式的组成部分:

  1. 组件接口(Component Interface):定义了操作方式,所有叶子对象和复合对象都必须实现这个接口。
  2. 抽象类(Abstract Class):实现了组件接口,并为所有具体类提供一个统一的接口。它还定义了添加、删除和获取子组件的方法。
  3. 具体组件(Leaf):实现组件接口,不包含子组件,是结构的叶节点。
  4. 复合组件(Composite):实现组件接口,同时包含子组件,可以包含其他复合组件或具体组件。

组合模式如何用于树形结构:

  1. 定义组件接口:首先定义一个组件接口,它包含所有操作,比如add(), remove(), getChild(int)等。

  2. 实现具体组件:创建具体组件类,实现组件接口。这些类代表树结构中的叶节点,不包含子节点。

  3. 实现复合组件:创建复合组件类,它也实现组件接口,但同时管理一组子组件。它可以包含其他复合组件或具体组件。

  4. 客户端代码:客户端代码通过组件接口与对象交互,可以对单个对象或树结构中的组合对象执行相同的操作。

  5. 遍历树结构:使用组合模式,可以很容易地遍历树结构,无论是访问叶子节点还是组合节点。

组合模式的优点:

  • 透明性:客户端代码可以一致地处理单个对象和组合对象,不需要知道它们之间的区别。
  • 灵活性:可以轻松地添加新的组件类型,而不需要修改现有代码。
  • 扩展性:可以扩展树结构,添加新的子组件或组合组件,而不影响其他部分。
  • 安全性:组合模式隐藏了树结构的具体实现,提供了一个安全的接口。

应用场景:

  • 当需要表示对象的“部分-整体”层次结构时。
  • 当希望客户端忽略组合对象与单个对象的不同,统一对待它们时。
  • 当需要能够操作整个组合结构或其中的单个对象时。

示例:

假设我们有一个文件系统,其中包含文件和文件夹。文件夹可以包含其他文件夹和文件。使用组合模式,我们可以这样实现:

// 组件接口
interface Component {void add(Component component);void remove(Component component);Component getChild(int index);void operation();
}// 具体组件(文件)
class File implements Component {private String name;public File(String name) {this.name = name;}@Overridepublic void add(Component component) {throw new UnsupportedOperationException();}@Overridepublic void remove(Component component) {throw new UnsupportedOperationException();}@Overridepublic Component getChild(int index) {throw new UnsupportedOperationException();}@Overridepublic void operation() {System.out.println("File: " + name);}
}// 复合组件(文件夹)
class Folder implements Component {private String name;private List<Component> children = new ArrayList<>();public Folder(String name) {this.name = name;}@Overridepublic void add(Component component) {children.add(component);}@Overridepublic void remove(Component component) {children.remove(component);}@Overridepublic Component getChild(int index) {return children.get(index);}@Overridepublic void operation() {System.out.println("Folder: " + name);for (Component child : children) {child.operation();}}
}// 客户端代码
Folder root = new Folder("root");
Folder docs = new Folder("documents");
File doc1 = new File("document1.txt");root.add(docs);
docs.add(doc1);// 遍历文件系统
root.operation();

通过这种方式,组合模式允许我们以统一的方式处理文件和文件夹,无论它们是单独的文件还是文件夹中的文件。这使得文件系统的遍历和管理变得更加简单和灵活。

十二、状态模式和策略模式有什么区别?

状态模式(State Pattern)和策略模式(Strategy Pattern)都是行为设计模式,它们用于不同的场景和解决不同的问题。下面详细比较这两种模式的区别:

状态模式(State Pattern)

  1. 目的:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
  2. 使用场景:当一个对象的行为取决于它的状态,并且它的状态值在运行时改变时。
  3. 实现方式:通过定义一系列的状态类,每个状态类实现相同的接口或继承自同一个抽象类,并且包含状态特定的行为。
  4. 优点:封装了转换规则,使得状态转换逻辑与使用状态的对象分离,易于扩展新的状态。
  5. 缺点:可能导致系统中状态类的数量增多,每个状态类都需要实现所有的行为。

策略模式(Strategy Pattern)

  1. 目的:定义一系列算法,把它们一个个封装起来,并使它们可互换。策略模式让算法的变化独立于使用算法的客户。
  2. 使用场景:当需要在运行时选择使用不同的算法或行为时。
  3. 实现方式:通过定义一个策略接口或抽象类,不同的具体策略类实现这个接口或继承自这个抽象类,然后在运行时根据需要选择使用哪一个策略。
  4. 优点:算法可以独立于使用它们的客户端变化,易于扩展新的算法。
  5. 缺点:客户端必须知道所有策略类的存在,这可能会导致客户端与策略类的耦合度较高。

主要区别:

  1. 关注点

    • 状态模式关注的是对象状态的变化以及状态变化对对象行为的影响。
    • 策略模式关注的是算法或行为的变化,以及在运行时选择不同的算法或行为。
  2. 使用目的

    • 状态模式用于根据对象的当前状态来改变其行为。
    • 策略模式用于在运行时根据不同的策略来改变对象的行为。
  3. 实现结构

    • 状态模式通常包含一个上下文类,该类维护一个状态对象的引用,并且所有的状态类都实现同一个接口或继承自同一个抽象类。
    • 策略模式通常包含一个上下文类,该类维护一个策略对象的引用,并且所有的策略类都实现同一个策略接口或继承自同一个策略抽象类。
  4. 扩展性

    • 在状态模式中,添加新的状态可能需要修改上下文类,以包含新状态的逻辑。
    • 在策略模式中,添加新的策略通常不需要修改上下文类,只需要实现新的策略类并在运行时使用。
  5. 耦合度

    • 状态模式中,上下文类与具体状态类的耦合度较高,因为上下文类需要引用具体的状态类。
    • 策略模式中,上下文类与具体策略类的耦合度较低,因为上下文类只引用策略接口。
  6. 应用范围

    • 状态模式适用于状态依赖的行为变化,如权限管理、订单状态管理等。
    • 策略模式适用于算法或行为的多样性,如排序算法的选择、支付方式的选择等。

通过理解这些区别,你可以更好地根据具体问题选择适合的设计模式。

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

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

相关文章

鸿蒙开发通信与连接:【@ohos.bluetooth (蓝牙)】

蓝牙 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 蓝牙模块提供了基础的传统蓝牙能力以及BLE的扫描、广播等功能。 导入模块 import bluetooth from ohos.bluetooth;bluetooth.enableBluet…

【YOLOv10:在简约中发现卓越,VanillaNet定义目标检测新标准】

本文改进:神经网络模型VanillaNet 1.YOLOv10介绍 论文:[https://arxiv.org/pdf/2405.14458] 代码: https://gitcode.com/THU-MIG/yolov10?utm_source=csdn_github_accelerator&isLogin=1 摘要:在过去的几年里,由于其在计算成本和检测性能之间的有效平衡,YOLOS已经成…

【论文精读】RayMVSNet

今天读的是发表在CVPR2022上的无监督MVS文章&#xff0c;作者来自于国防科大。 文章链接&#xff1a;RayMVSNet 项目地址&#xff1a;Github Abstract 作者希望直接优化每个camera ray上的深度值&#xff0c;所以提出这个RayMVSNet来学习1D implicit field的序列预测。使用了…

软件测试之Linux常用基础

目录 1 总体介绍2 Linux操作系统3 应用领域和主流操作系统4 远程连接4.1 常用命令4.2 系统目录4.3 目录和文件管理4.3.1 目录管理命令4.3.2 文件管理命令 4.5 压缩和解压缩 5 用户权限5.1 用户和权限5.2 权限修改5.3 超级用户 6 进程管理7 端口面试题 1 总体介绍 操作系统作用…

第四篇:精通Docker构建:Dockerfile的艺术与策略

精通Docker构建&#xff1a;Dockerfile的艺术与策略 1. 开篇&#xff1a;探索Docker的革命 在探讨我们的主题之前&#xff0c;让我们先回顾一下Docker的概念。Docker是一个开源平台&#xff0c;用于自动化应用程序的部署、扩展和管理&#xff0c;这一切都是在轻量级的容器中进…

【通过新能源汽车的智慧数字底盘技术看计算机的相关技术堆栈?以后是软硬结合的全能程序员的天下,取代全栈(前后端都会的全栈程序员)】

汽车的“智慧数字底盘”是一个综合性的技术平台&#xff0c;旨在提升车辆的性能、安全性和驾驶体验。它集成了多种先进的技术和系统&#xff0c;是全能程序员的必杀技&#xff01; 1. 传感器技术 a. 激光雷达&#xff08;LiDAR&#xff09; 用于生成高分辨率的3D地图&#…

[吃瓜教程]概览西瓜书+南瓜书第1、2章

第一章 绪论 1.1机器学习的定义,什么是机器学习&#xff1f; 1&#xff09;机器学习是这样一门学科&#xff0c;它致力于研究如何通过计算的手段&#xff0c;利用经验来改善系统自身的性能。 2&#xff09;机器学习所研究的主要内容是关于在计算机上从数据中产生模型的算法&a…

给日期加上15天

// 给当前日期加上15天 function toAndTimeFifteen(params) {let startDate new Date(params); // 创建一个Date对象表示2024年5月31日startDate.setDate(startDate.getDate() 15); // 给当前日期加上15天let dateString formatDate(startDate)// 转换时间格式return dateSt…

之所以选择天津工业大学,因为它是双一流、报考难度适宜,性价比高!天津工业大学计算机考研考情分析!

天津工业大学&#xff08;Tiangong University&#xff09;&#xff0c;简称“天工大”&#xff0c;位于天津市&#xff0c;是教育部与天津市共建高校、国家国防科技工业局和天津市共建的天津市重点建设高校、国家“双一流”建设高校、天津市高水平特色大学建设高校、中国研究生…

【html】用html+css做地表最强王者荣耀辅助工具

源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>* {margin: 0;padding: 0;}body{background-color: blue;}.con {width: 300px;height: 500px;background-color: rgba(230,…

比特币-系统架构师(十四)

1、传统的软件生命周期划分为&#xff1a;软件定义、软件开发、软件运行、软件维护。 2、以下关于区块链所用系统重挖矿行为描述中&#xff0c;错误的是&#xff08;&#xff09;。 A旷工挖矿取得区块链计账权&#xff0c;同时获得代币 B挖矿本质是尝试计算一个hash碰撞 C挖…

6.Hugging Face Transformers 快速入门

Hugging Face Transformers 库独特价值 丰富的预训练模型&#xff1a;提供广泛的预训练模型&#xff0c;如BERT、GPT、T5等&#xff0c;适用于各种NLP任务。易于使用&#xff1a;设计注重易用性&#xff0c;使得即使没有深厚机器学习背景的开发者也能快速上手。最新研究成果的…

程序员之路:塑造卓越职业素养的探索与实践

序章 在这个数字时代&#xff0c;程序员作为技术进步的推动者&#xff0c;不仅需要掌握扎实的技术技能&#xff0c;更需具备高尚的职业素养&#xff0c;以应对日益复杂的行业挑战。职业素养&#xff0c;犹如编程中的“算法”&#xff0c;虽无形却决定着个人发展的效率与质量。本…

chrome 录制器及性能分析工具的使用

需求背景&#xff1a; 对比不同VPN方案网络延迟的差异。 验证工具&#xff1a; chrome浏览器自带的录制器、性能插件可以完美的解决这个问题。 注意&#xff1a;录制的操作都在当前页面&#xff0c;不存在新开标签页的场景 解决方案&#xff1a; 使用chrome录制器&#xf…

18张Python数据科学速查表.png

数据科学已经发展成为一个庞大的系统&#xff0c;包含数学、统计学、概率论、计算机、数据库、编程等各种理论技术。 目前在主流的数据科学领域一般有三大生态&#xff0c;一是以sas、matlab、spss等为代表的商业软件生态&#xff0c;二是围绕R语言建立起来的开源生态&#xf…

[Linux] 文件/目录命令

pwd print working directory cd change directory cd #返回主目录 cd ..返回上级目录 cd . 不动 cd ~ 用户名 进入某用户的主目录 mkdir mkdir 目录名 mkdir -p xx/yy/zz #一次创建多重目录 rmdir remove directory 删除空目录&#xff0c;只能删除空目录&#xff0c;别的不能…

C++ lambda表达式举例

C lambda表达式 Lambda表达式是一种简洁的方式来创建匿名函数&#xff0c;可以直接在函数调用的地方定义&#xff0c;主要用于简化代码。 Lambda表达式的基本语法如下&#xff1a; [capture](parameters) -> return_type {// function body };示例1&#xff1a;基本用法 …

嵌入式开发十八:USART串口通信实验

上一节我们学习了串口通信的基本理论&#xff0c;串口通信是学习单片机的一个重要的一步&#xff0c;非常重要&#xff0c;这一节我们通过实验来学习串口通信的使用&#xff0c;以及串口的接收中断的使用。 一、发送单个字节uint8_t数据或者字符型数据 实现的功能&#xff1a;…

React@16.x(33)动画(上)

目录 1&#xff0c;Transition一些常用 props1&#xff0c;mountOnEnter2&#xff0c;unmountOnExit3&#xff0c;appear 2&#xff0c;CSSTransition2.1&#xff0c;和 Transition 组件的区别2.2&#xff0c;举例2.3&#xff0c;常用 props2.3.1&#xff0c;classNames2.3.2&a…

【UE数字孪生学习笔记】 Apifox一体化接口测试平台

声明&#xff1a;部分内容来自于b站&#xff0c;知乎&#xff0c;慕课&#xff0c;公开课等的课件&#xff0c;仅供学习使用。如有问题&#xff0c;请联系删除。 部分内容来自UE官方文档&#xff0c;博客等 Apifox接口测试 Apifox 是集 API 文档、API 调试、API Mock、API 自动…