设计模式面试行为型设计模式你清楚几个?
Posted 波波烤鸭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式面试行为型设计模式你清楚几个?相关的知识,希望对你有一定的参考价值。
【金三银四】设计模式篇
1.谈谈你对设计模式的理解
1.首先谈设计模式的作用:经验的传承,提高了软件复用的水平,最终达到提高软件开发效率
设计原则 | 简单说明 |
---|---|
单一职责 | 一个类只负责一项职责 |
里氏替换原则 | 子类可以扩展父类的功能,但不能改变父类原有的功能 |
依赖倒置原则 | 要依赖于抽象,不要依赖于具体,核心思想是面向接口编程 |
接口隔离原则 | 建立单一接口,不要建立庞大臃肿的接口,<br> 尽量细化接口,接口中的方法尽量少 |
迪米特法则 (最少知道原则) | 一个对象应该对其他对象保持最少的了解 |
开闭原则 | 对扩展开放,对修改关闭 |
2.设计模式的分类
3.创建型模式:都是用来帮助我们创建对象的!
4.结构性模式:关注对象和类的组织
5.行为型模式:关注系统中对象之间的相互交换,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责,共有11中模式
行为型模式
行为型模式关注的是对象之间的通信,也就是描述多个类或者对象之间,通过协作共同完成一个任务。主要涉及的是 对象 和 算法之间职责的分配。
行为型模式分为两类:
- 类行为模式: 通过继承机制来在类间分派行为。 主要是通过多态来分配父类和子类的职责
- 对象行为模式: 通过组合或聚合,在对象间分派行为。通过对象关联等方式来分配类的职责。
1.谈谈你对解释器模式的理解
1.1 解释器模式的作用
解释器模式在业务开发面是很少接触到的。主要的作用是定义的解释器来解析各种表达式,比如SQL语句,SPEL表达式,权限注解中的表达式 hasAnyRole(‘ROLE_ADMIN’)等。
1.2 解释器的应用
比较常见的应用比如Spring中的针对SPEL表达式做的解析处理
public static void main(String[] args)
SpelExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("500-100*2+60");
Object value = expression.getValue();
System.out.println("value = " + value);
2.谈谈你对模板模式的理解
2.1 模板模式的作用
模板模式是一种相对简单的设计模式。作用是在父类中固定程序的执行顺序,具体的实现在子类中实现。比如银行定义每个人去银行开户的流程,
- 取号
- 填写单子
- 等待
- 办理业务
- 结束
然后每个人来开户都会走这个流程,只是每个人的具体操作内容会有区别
2.2 模板模式的应用
模板模式的应用就比较多如下:
- Servlet中的doGet和doPost方法
- Spring中的JdbcTemplate
- MyBatis中的Executor处理
- …
3.责任链模式
3.1 责任链模式的作用
将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象处理。
3.2 责任链模式的应用
责任链模式的应用场景比较多,对大家来说印象比较深刻的应该是SpringSecurity中的处理请求的过滤器链了。
可以和面试官具体聊下SpringSecurity中的这块设计。当然还有一些其他的也可聊比如:
- Java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch.
- javascript语言中,事件的冒泡和捕获机制。Java语言中,事件的处理采用观察者模式。
- SpringMVC中,拦截器的调用也是典型的责任链模式
- 同样的Servlet中的过滤器链同样是责任链模式的实现。
4.观察者模式
4.1 观察者模式的作用
建立对象与对象之间的依赖关系,一个对象发生改变时,会自动通知其他对象。这个场景中,发生改变的对象被称为观察目标,被通知的对象称为观察者。一个观察目标可以有多个观察者,而这些观察者之间可以没有联系,可以根据需要增加或删除观察者。
4.2 观察者模式的应用
观察者模式在Java编程中用到最多的可能就是事件模块的处理,可以和面试官详细的聊下Spring的事件管理机制或者SpringBoot的事件处理机制。我们以SpringBoot的事件机制为例来说明
https://blog.csdn.net/qq_38526573/article/details/122143258 单独通过一篇文章来说明事件的本质。
5.策略模式
5.1 策略模式的作用
策略模式的作用就是我们想要实现某个目的,实现的方式可以有很多种,那么这里的每一种实现方式都可以称为一种策略。比如:
我们可以将每一种交通方式都封装为一个独立的类,这就是一种策略。为了保证策略的一致性,还可以用一个抽象的交通方式类 来 做交通方式的定义。
5.2 策略模式的应用
策略模式在实际开发中用到的同样会比较多。
- AOP 中根据不同的策略可以通过JDK动态代理或者CGLIB代理来创建代理对象
- Spring框架中的Resources接口,资源访问的策略
- Servlet中的service方法,会根据客户端的不同提交方式来调用对应的doGet或者doPost方法来处理请求
- Shiro中的多Realm认证中,根据我们不同的配置可以使用所有Realm认证通过或者其中一个认证通过等
- SpringSecurity中的Authentication对象的存储方式
- …
6.迭代器模式
6.1 迭代器模式的作用
场景:访问聚合对象中的各个元素的时候,比如链表的遍历。我们一般是将遍历的方法也放在链表类中。但是如果需要修改遍历方法,就需要修改链表类的代码,违背了开闭原则。
迭代器模式就是在客户访问和聚合类之间插入一个迭代器,这样就将聚合对象 和 遍历方法解耦了,并且对外隐藏其实现细节。
6.2 迭代器模式的应用
- JDK中的List/Set集合中的迭代器
- …
7.中介者模式
7.1 中介则模式的作用
对象之间具有很强的关联性,而且有大量的相互调用,这种情况下,如果一个对象发生了变化,就需要追踪该对象关联的其他对象,并进行相应的处理,这就变得很复杂。而中介者模式,就是用一个中介者对象来封装一系列的对象交互,中介者使各对象不需要显式的相互引用,这就使得系统变得低耦合。比如:
假如没有总经理。下面三个部门:财务部、市场部、研发部。财务部要发工资,让大家核对公司需要跟市场部和研发部都通气;市场部要接个新项目,需要研发部处理技术、需要财务部出资金。市场部跟各个部门打交道。 虽然只有三个部门,但是关系非常乱。
实际上,公司都有总经理。各个部门有什么事情都通报到总经理这里,总经理再通知各个相关部门。
7.2 中介则模式的应用
- MVC模式中的C,控制器就是一个中介者对象,M和V都和C打交道
- 代理对象中的invoke方法,客户端和目标对象都是通过invoke来打交到的。
- …
8.状态模式
场景: 如果一个对象的行为会根据 其某个属性的变化而不同,那这个属性就可以被称为该对象的状态。这样的对象也被称为有状态对象(stateful)。如果这样的对象因为某些事件,其内部状态发生了改变,那么系统的行为也要随之发生变化的话,就可以使用状态模式。
9.命令模式
场景:请求的发送者和接收者之间解耦,让对象之间的调用关系更加灵活。发送者和接收者之间没有直接的引用关系,发送请求的对象只需要知道如何发送,而不必关心如何完成请求。
10.备忘录模式
场景:记录一个对象的内部状态,当用户后悔时能撤销当前的操作,是数据恢复到它原来的状态。比如我们编程的时候,ctrl+z 就是撤销当前操作,恢复到修改前的状态。又叫快照模式。
11.访问者模式
场景:有些集合对象中会有多种不同的元素,每种元素都有不同的访问者 和 处理方式。这种被处理的数据元素相对稳定,但是处理方式比较多样的情况,可以用访问者模式来处理。
访问者模式将数据结构中的各元素的操作分离出来,封装成独立的类,使其在不改变数据结构的前提下,可以添加作用于这些元素的新操作。为数据结构中的每个元素提供多种访问方式。
2022深度学习开发者峰会 5月20日13:00让我们相聚云端,共襄盛会!以上是关于设计模式面试行为型设计模式你清楚几个?的主要内容,如果未能解决你的问题,请参考以下文章