设计模式面试题

概述

设计模式分类

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

类图

概述

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

表示

类的表示

包含类名、属性(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.rhkb.cn/news/309753.html

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

相关文章

vue3 动态class和style

1、需求:一个删除的弹窗,点击会提示“是否需要删除XXXXX(name)”,但是name不固定,所以删除弹窗的width不能写死。(如果不设置width,本项目的弹窗会自适应变得特别长)

JavaScript之Proxy详解

文章的更新路线:JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题(HTML基础知识和CSS基础知识已经更新完毕) 正文 Proxy是JavaScript中的一个强大而灵活…

【我的代码生成器】生成React页面类

有了数据表的结构信息,就能生成React 的页面类,快捷方便。 生成界面如下: 生成的React FrmUser.js页面如下: 只需再写里面的操作逻辑代码。

【计算机考研】跨考408直接看王道,不看教材可行吗?

一般备考都不会看教材的!如果时间特别充足可以看一下教材 王道的四件套无疑是大多数同学的首选。相比其他课程来说,也是属于市面上最好的408课程了。 从今年的难度来看选择题部分和计网,比起往年来看是有很多偏题,大题除了计网的…

zabbix 使用 dataease 做数据大屏

1、环境介绍 操作系统:龙蜥os 7.9 软件:dataease v1.18.18 zabbix: 6.0 2、软件下载 https://community.fit2cloud.com/#/products/dataease/downloads 3、将软件包上传到服务器并解压缩 tar -xvf dataease-v1.18.18-offline.tar.gz4、修改…

【Java框架】Mybatis教程(一)——环境搭建及基本CRUD操作

目录 持久化与ORMORM(Object Relational Mapping)ORM解决方案包含下面四个部分 MyBatis简介特点MyBatis框架优缺点优点缺点 搭建MyBatis开发环境步骤1. 创建Maven工程,导入MyBatis依赖的组件2. 编写MyBatis核心配置文件(mybatis-config.xml)示…

ubuntu22安装snipaste

Ubuntu 22.04 一、Snipaste 介绍和下载 Snipaste 官网下载链接: Snipaste Downloads 二、安装并使用 Snipaste # 1、进入Snipaste-2.8.9-Beta-x86_64.AppImage 目录(根据自己下载目录) cd /home/jack/Downloads/softwares/AppImage# 2、Snipaste-2.8.9-…

Docker镜像,什么是Docker镜像,Docker基本常用命令

docker镜像 1.1什么是镜像,镜像基础 1.1.1 镜像的简介 镜像是一种轻量级,可执行的独立软件包,也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境,具体来说镜像包含运行某个软件所需的所有内容,…

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…

代码学习记录42---动态规划

随想录日记part42 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.14 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;最长递增子序列 &#xff1b;最长连续递增序列 &#xff1b;最长重复子数组 ;最长公…

mac基础操作、快捷、软件快捷方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 mac基础操作、快捷、软件快捷方式 前言mac快捷操作快捷查找切换页面页面缩略访达和命令端切换创建文件夹创建文件删除文件/文件夹获取文件的路径移动文件或文件夹复制文件命令端常用命令 前言 主要是方…

B端:请说出你的设计依据,咋办?来吧,尼尔森法则告诉他。

在B端界面设计中&#xff0c;客户经常会问这样设计的依据是什么&#xff0c;许多设计师回答不上来&#xff0c;或者是答非所问&#xff0c;流于表面&#xff0c;这是时候就需要请出来尼尔森用户体验设计的十大法则&#xff0c;那么问题来了&#xff0c;如何让这10大法则和界面相…

Python学习笔记23 - 目录操作

os模块操作目录相关函数 os.path模块操作目录相关函数 案例1 —— 列出指定目录下的所有.py文件 案例2 —— walk()

论文笔记:NEFTune: Noisy Embeddings Improve Instruction Finetuning

iclr 2024 reviewer 评分 5666 1 论文思路 论文的原理很简单&#xff1a;在finetune过程的词向量中引入一些均匀分布的噪声即可明显地提升模型的表现 2 方法评估

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议&#xff08;CHHASD2024&#xff09;将在中国武汉举行&#xff0c;主题为“文化、历史&#xff0c;人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…

c++中常用库函数

大小写转换 islower/isupper函数 char ch1 A; char ch2 b;//使用islower函数判断字符是否为小写字母 if(islower(ch1)){cout << ch1 << "is a lowercase letter." << end1; } else{cout << ch1 << "is not a lowercase lette…

图形学基础:二维三维刚体的移动、缩放和旋转矩阵

一、二维 1.1 缩放矩阵 x&#xff0c;y分别表示在x轴&#xff0c;y轴缩放的倍数 示例&#xff1a; 点(2,1)在x&#xff0c;y轴上分别缩放x倍&#xff0c;y倍 1.2 平移矩阵 x&#xff0c;y分表表示在x轴&#xff0c;y轴上移动的距离 示例&#xff1a;点&#xff08;2,1&#xf…

AI天使汇联合150家顶级基金、战投,征集优秀AI创业项目

鉴于AI天使汇主办的2024年3月期优秀项目征集活动效果超出预期&#xff0c;3月活动最后TOP20路演者中已有多家快速拿到了TS。 路演活动质量受到了AI创业公司和基金/战投伙伴的高度评价&#xff0c;现在开始四月期活动报名! 本期征集活动联合的顶级基金和战投数量增加到了150家…

LabVIEW无线快速存取记录器(WQAR)测试平台

LabVIEW无线快速存取记录器&#xff08;WQAR&#xff09;测试平台 随着民用航空业的迅速发展&#xff0c;航空安全的保障日益成为公众和专业领域的关注焦点。无线快速存取记录器&#xff08;WirelessQuick Access Recorder, WQAR&#xff09;作为记录飞行数据、监控飞行品质的…