设计模式面试题

概述

设计模式分类

  • 创建型模式
    用于描述“怎样创建对象”,主要特点是“将对象的创建与使用分离”。使用者不需要官族对象创建的细节。
  • 结构型模式
    用于描述如何将类或对象按照某种布局组成更大的结构。
  • 行为型模式
    用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。

类图

概述

  • 模型中的静态结构,描述了系统中类的集合,类的属性和类之间的关系;
  • 是系统分析和设计阶段的产物

表示

类的表示

包含类名、属性(field)和方法(method)且带有分割线的矩形表示
在这里插入图片描述
属性/方法名称前的 +- 等表示这个属性/方法的可见性

  • +: public
  • -: private
  • #: protected
    属性的完整表示方式为:** 可见性 名称 :类型 [ = 缺省值]**
    方法的完整表示方式为:** 可见性 名称(参数列表) [ : 返回类型]**

类和类之间关系的表示方式

关联关系

类和类之间最常用的关系,表示一类对象与另一类对象之间的联系。

  • 单向关联:用一个带箭头的实线表示。
    在这里插入图片描述- 双向关联:双方各自持有对方类型的成员变量,用无箭头实线表示。
    在这里插入图片描述- 自关联:用一个带有箭头并指向自身的线表示。
    在这里插入图片描述
聚合关系

强关联关系,表示整体和部分之间的关系。聚合关系也是通过成员对象实现,其中成员对象是整体对象中的一部分,但是成员对象可以单独存在。
使用带空心菱形的实线来表示,菱形指向整体。
在这里插入图片描述

组合关系

也是整体和部分的关系,其中整体对象可以控制部分对象的生命周期。一旦整体对象不存在,部分对象也无法独立存在。
用带实心菱形的实现表示,菱形指向整体。
在这里插入图片描述

依赖关系

一种使用关系,对象之间耦合度嘴弱的一种关联方式。在代码中,某一个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类中的某些方法来完成一些职责。
用带箭头虚线表示,从使用类指向被依赖的类。
在这里插入图片描述

继承关系

对象之间耦合度最大的一种关系,用带空心三角箭头的实线来表示,箭头从子类指向父类。
在这里插入图片描述

实现关系

接口与实现类之间的关系,用带空心三角箭头的虚线表示,箭头从实现类指向接口。
在这里插入图片描述

设计原则

开闭原则

对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能修改原有的代码,实现一个热插拔的效果。

里氏代换原则

任何基类可以出现的地方,子类一定可以出现。即子类可以扩展父类的功能,但是不能改变父类原有的功能。

依赖倒装原则

高层模块不应该依赖底层模块,两者都应当依赖抽象模块;抽象不应当依赖于细节,细节应当依赖于抽象。

接口隔离原则

客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。

迪米特法则

如果两个软件实体无需直接通信,那么就不应当发生直接的互相调用,可以通过第三方转发该调用。目的是降低类之间的耦合性,提高模块的相对独立性。

可以直接访问与当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。

合成复用原则

尽量先使用组合或者聚合等关联关系方法来实现,其次才考虑继承关系来实现。

继承复用缺点

  • 破坏了类的封装性,会将父类的实现细节暴露给子类(白箱调用)
  • 子类和父类的耦合度高,父类的任何改变都会导致子类的实现发生变化
  • 限制了复用的灵活性,运行时不能发生变化

组合/聚合复用优点

  • 维持了类的封装性
  • 耦合度低,可以在类的成员位置声明抽象
  • 复用的灵活性高,可以在运行时动态引用与成分对象类型相同的对象。

创建者模式

单例设计模式(创建对象的最佳模式)

该种模式涉及一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

  • 单例类:只能创建一个实例的类
  • 访问类:使用单例类

工厂方法模式

用于对象和对象之间解耦

简单工厂模式

包括如下角色:

  • 抽象产品:定义了产品的规范,描述产品的主要特性和功能
  • 具体产品:实现或者继承产品的子类
  • 具体工厂:提供创建产品的方法,调用者通过该方法来获取产品。

所有产品共有一个工厂,如果新增产品,则需要修改代码,也会违反开闭原则

工厂方法模式

给每个产品都提供了一个工厂,完全遵循开闭原则
主要角色:

  • 抽象工厂:提供创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品
  • 具体工厂:实现抽象工厂中的抽象方法,完成具体产品的创建
  • 抽象产品:定义了产品的规范,描述产品的主要特性和功能
  • 具体产品:实现了抽象产品角色所定义的接口,由具体工厂创建,同具体工厂之间一一对应。
    缺点:每新增一个产品都要增加新的产品类和工厂类,增加了代码复杂性

抽象工厂模式

工厂方法模式只考虑生产同等级产品,抽象工厂可以处理多等级产品的生产。使用一个超级工厂区创建其它工厂。

行为型模式

策略模式

  • 定义一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的客户。
  • 通过对算法进行封装,将使用算法的责任与算法的实现分割开,并委派给不同的对象对这些算法进行管理。
    策略模式中主要角色如下:
  • 抽象策略类:一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有具体策略类所需的角色。
  • 具体策略类:实现了抽象策略类定义的接口,提供具体的算法实现或行为
  • 环境类:持有一个策略类的引用,最终给客户端调用


优点:

  • 策略类之间可以自由切换
  • 易于扩展
  • 避免使用多重条件选择语句
    缺点:
  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
  • 策略模式将产生很多策略类

责任链设计模式

为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的应用而连城一条链;当有请求发生时,可以将请求沿着这条链传递,直到有对象处理它为止。
主要角色

  • 抽象处理者:定义一个处理请求的接口,包括抽象处理方法和一个后继连接
  • 具体处理者:实现抽象处理者的处理方法,判断能否处理本次请求。如果可以处理请求则处理,否则将该请求转给它的后继者。
  • 客户类角色:创建处理链,并向链头的具体处理者对象提交请求,不关心处理细节和请求传递过程。
    优点
  • 降低了对象之间的耦合度
  • 增强了系统的可扩展性
  • 增强了给对象指派职责的灵活性
  • 简化了对象之间的连接
  • 责任分担
    缺点
  • 针对较长的责任链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响
  • 责任链建立的合理性需要靠客户端来保证,增加了客户端的复杂性,可能会由于责任链的错误设置导致系统出错,甚至可能产生循环调用。

开闭原则 DEMO

抽象类

public abstract class AbstractSkin {public  abstract void display();
}

对抽象类的不同实现
DefaultSkin

public class DefaultSkin extends AbstractSkin{@Overridepublic void display() {System.out.println("默认皮肤");}
}

NewSkin

public class NewSkin extends AbstractSkin{@Overridepublic void display() {System.out.println("NEW SKIN");}
}

整合类

public class Test {public static void main(String[] args){SougouInput sougouInput = new SougouInput();//DefaultSkin skin = new DefaultSkin();NewSkin skin = new NewSkin();sougouInput.setSkin(skin);sougouInput.display();}
}

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

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

相关文章

Domain Admin:方便快捷的图形化域名和SSL证书监测平台

Domain Admin:一目了然,一键掌握,您的全方位图形化域名与SSL证书智能管家!- 精选真开源,释放新价值。 概览 Domain Admin是一个基于Python Vue3.js 技术栈实现的域名和SSL证书监测平台,旨在为用户打造一个…

7-17 爬动的蠕虫

题目链接&#xff1a;7-17 爬动的蠕虫 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 #include <stdio.h>int main(void) {unsigned int n, u, d;unsigned int minute, high;if (scanf("%d %d %d", &n, &u, &d) ! 3) {retur…

有关栈的算法

例题一 解法&#xff08;栈&#xff09;&#xff1a; 算法思路&#xff1a; 本题极像我们玩过的「开⼼消消乐」游戏&#xff0c;仔细观察消除过程&#xff0c;可以发现本题与我们之前做过的「括号匹配」问题是类似的。当前元素是否被消除&#xff0c;需要知道上⼀个元素的信息…

C/C++如何快速学习?少走3年弯路

于我而言&#xff0c;最开始学习就是 C&#xff0c;除了计算机专业&#xff0c;其他专业可能学习的第一门编程语言为 C 语言&#xff0c;还是谭浩强爷爷那本&#xff0c;当时想着有点 C 基础&#xff0c;无外乎就是 C 语言的升级版&#xff0c;于是开启了 C 的路程。 语言这个…

《深入Linux内核架构》第4章 进程虚拟内存(1)

目录 4.1 简介 4.2 进程虚拟地址空间 4.2.1 进程地址空间分布 4.2.2 建立布局 第3章讲了两点&#xff1a;物理内存的管理&#xff0c;内核虚拟地址管理。 本章讲&#xff1a;用户进程的虚拟地址空间管理。 4.1 简介 一个进程的整个虚拟地址空间&#xff08;0-3G&#xf…

JKTECH柔性振动盘柔性上料机

柔性供料器&#xff1a;用途广泛与好处显著 在现代工业生产中&#xff0c;随着技术的不断进步和市场的多样化需求&#xff0c;对物料供应系统的要求也日益提高。柔性供料器&#xff0c;作为一种新型的物料供应装置&#xff0c;其用途广泛且好处显著&#xff0c;正逐渐受到各行…

苍穹外卖亮点再梳理 ||

一、项目整体亮点&#xff1a; 【注&#xff1a;基于每个亮点&#xff0c;均有整理的相关知识&#xff0c;可在博客中查看】 1.数据库的设计采用RBAC&#xff08;基于角色访问控制&#xff09;的权限设计。 RBAC将权限授予角色&#xff0c;然后将用户分配给角色&#xff0c;…

算法——倍增

. - 力扣&#xff08;LeetCode&#xff09; 给你一棵树&#xff0c;树上有 n 个节点&#xff0c;按从 0 到 n-1 编号。树以父节点数组的形式给出&#xff0c;其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。 树节点的第 k 个祖先节点是从该节点到根节点路径…

指针 基础知识

本笔记为观看56 指针-指针的定义和使用_哔哩哔哩_bilibili后的学习笔记 指针的定义和使用 1、定义指针 int main () {//1、定义指针int a 10;//指针定义的语法&#xff1a; 数据类型 * 指针变量名&#xff1b;int * p;//让指针记录变量a的地址p &a; //& 为取址符cou…

电商技术揭秘十六:电商中的实时分析与决策支持系统

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

如何部署上线项目

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 多环境多环境分类前端多环境实战请求地址启动方式项目配置 后端多环境实战 项目部署原始部署前端…

【项目】棋海争锋

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 项目介绍 WebSocket介绍 使用 项目创建 数据库设计 用户模块 登录接口 注册接口 获取用户信息接口 匹配模块 …

【Bing】开启代理后使用 Bing 搜索引擎总是: 没有与此相关的结果

【Bing】开启代理后使用 Bing 搜索引擎总是: 没有与此相关的结果 1 问题描述2 解决方法2.1 修改代理规则2.1.1 Clash Verge2.1.2 Clash Verge Rev2.1.3 V2RayN 1 问题描述 当我开了代理访问 Bing 时&#xff0c;经常会出现下面的页面: 2 解决方法 我所知的有三种方法: 手动关…

关于JVM-三色标记算法剖析

相关系列 深入理解JVM垃圾收集器-CSDN博客 深入理解JVM垃圾收集算法-CSDN博客 深入理解jvm执行引擎-CSDN博客 jvm优化原则-CSDN博客 jvm流程图-CSDN博客 三色标记产生的原因&#xff1f; 在并发标记的过程中&#xff0c;因为标记期间应用线程还在继续跑&#xff0c;对象间的引…

使用Matplotlib绘制打断图Broken Axis

使用Matplotlib绘制打断坐标轴Broken Axis 对于一批存在离群点的或者两极分化的数据&#xff0c;为了突出其值域差异&#xff0c;时常需要用到打断坐标轴效果。 使用Matplotlib绘制的效果如下&#xff1a; 对于同样的数据&#xff0c;使用brokenaxes库的绘制效果如下&#x…

Ubuntu20.04安装和编译运行lidar_align来联合标定lidar与imu的外参

硬件&#xff1a;树霉派4b 1、下载并安装lidar_align mkdir -p lidar_align/src cd lidar_align/src git clone https://github.com/ethz-asl/lidar_align.git 将 lidar_align/src/lidar_align/NLOPTConfig.cmake 文件移动到 lidar_align/src/ 下(与lidar_align同级) NLOP…

ShardingSphere-ShardingSphere读写分离和数据脱敏

文章目录 一、读写分离1.1 读写分离1.2 读写分离应用方案1.3 分表+读写分离1.4 分库分表+读写分离二、ShardingSphere-JDBC读写分离2.1 创建SpringBoot并添加依赖2.2 创建实体类2.3 创建mapper2.4 配置读写分离2.5 测试测试插入数据测试读测试事务一致性测试负载均衡一、读写分…

vue3+echarts:echarts地图打点显示的样式

colorStops是打点的颜色和呼吸灯、label为show是打点是否显示数据、rich里cnNum是自定义的过滤模板用来改写显示数据的样式 series: [{type: "effectScatter",coordinateSystem: "geo",rippleEffect: {brushType: "stroke",},showEffectOn: &quo…

【H3C】开启web管理页面H3C S5120V2 Series

配置步骤 1.创建对应vlan并放行通过 2.添加vlanfi的ip地址 3.开启http和https的服务 4.创建用户&#xff0c;配置密码&#xff0c;配置服务类型&#xff0c;赋予权限 假设终端连接在交换机的g1/0/1口 假设终端的ip地址为(Ubuntu)&#xff1a;192.168.200.11 /24 假设交换机vlan…

【Java 刷题记录】双指针

双指针 1. 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: n…