设计模式面试题

概述

设计模式分类

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

类图

概述

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

表示

类的表示

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

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

相关文章

没有学历,没有基础,是否能成为一个嵌入式工程师?

没有学历,且毫无基础,是否真的能够成为一名嵌入式工程师呢?想要成为一名真正足以胜任上下游工作的工程师,至少是需要耗费五年时间的。在这一过程当中,你将会遭遇各式各样的挑战,需要去掌控操作系统、数据结…

实时数据同步之Maxwell和Canal

文章目录 一、概述1、实时同步工具概述1.1 Maxwell 概述1.2 Canal概述 2、数据同步工作原理2.1 MySQL 主从复制过程2.2 两种工具工作原理 3、MySQL 的 binlog详解3.1 什么是 binlog3.2 binlog 的开启3.3 binlog 的分类设置 4、Maxwell和Canal对比5、环境安装 二、Maxwell 使用1…

护眼台灯哪个牌子好?精选五款备受好评性价比高的护眼灯

众所周知,用眼习惯是影响视力的一大因素,但往往忽略了光线对视力的关键作用。孩子在白天长时间用眼,若晚上又在昏暗环境下读书、写作或使用电子产品,这种双重负担会加剧眼睛疲劳,进而可能导致视力逐渐受损。随着熬夜学…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …

Springboot+Vue项目-基于Java+Mysql的网上订餐系统(附源码+LW+演示录像)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

太好玩了,我用 Python 做了一个 ChatGPT 机器人

毫无疑问,ChatGPT 已经是当下编程圈最火的话题之一,它不仅能够回答各类问题,甚至还能执行代码! 或者是变成一只猫 因为它实在是太好玩,我使用Python将ChatGPT改造,可以实现在命令行或者Python代码中调用。…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…

金蝶云星空与泛微OA对接案例-实现流程一体化

摘要:在企业数字化中,集成内部各业务系统以实现数据共享与流程协同,已成为提升运营效率、优化决策的重要选择。本文将以某企业成功实现金蝶云星空与泛微OA系统对接为例,详细解析双方在人员信息、组织架构、销售合同、付款申请、报…

算法打卡day41|动态规划篇09| Leetcode198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

算法题 Leetcode 198.打家劫舍 题目链接:198.打家劫舍 大佬视频讲解:198.打家劫舍视频讲解 个人思路 偷还是不偷,这取决于前一个和前两个房是否被偷了,这种存在依赖关系的题目可以用动态规划解决。 解法 动态规划 动规五部曲&#xff1…

你想来微软苏黎世混合现实研究中心学习和实习吗?

Microsoft Mixed Reality & AI Lab - Zurich 苏黎世混合现实研发中心简介 微软苏黎世混合现实与人工智能实验室概况 专注于利用计算机视觉绘制和理解环境,识别和跟踪相关物体,并帮助用户执行任务,构建混合现实的未来。该实验室还在探索混…

什么数据集成(Data Integration):如何将业务数据集成到云平台?

说到数据集成(Data Integration),简单地将所有数据倒入数据湖并不是解决办法。 在这篇文章中,我们将介绍如何轻松集成数据、链接不同来源的数据、将其置于合适的环境中,使其具有相关性并易于使用。 数据集成&#xff1…

5.8 mybatis之EnumTypeHandler详细使用

文章目录 1. 把java中枚举数据插入到数据库中2. 把数据库中值查询到java对象中 在 Java 中,枚举类型是一种特殊的类,当我们在数据库和 Java 对象之间进行映射时,通常需要将数据库中的某个字段(如字符串或数字)映射到 J…