最新2022年设计模式面试题高级面试题及附答案解析
最新2022年设计模式面试题高级面试题及附答案解析
全部面试题答案,更新日期:01月30日,直接下载吧!
下载链接:高清500+份面试题资料及电子书,累计 10000+ 页大厂面试题 PDF
设计模式
题1:Java 中如何实现解释器模式?
Java中实现解释器模式,说一说演示代码。
1、实体类Context,具体代码如下:
package com.yoodb;
public class Context {
private Integer numo;
private Integer numt;
public Context(Integer numo, Integer numt) {
this.numo = numo;
this.numt = numt;
}
public Integer getNumo() {
return numo;
}
public void setNumo(Integer numo) {
this.numo = numo;
}
public Integer getNumt() {
return numt;
}
public void setNumt(Integer numt) {
this.numt = numt;
}
}
2、一个接口,具体代码如下:
package com.yoodb;
public interface Expression {
public int interpret(Context context);
}
3、两个接口实现类,一个类是参数相加,一个类是参数相减,具体代码如下:
package com.yoodb;
public class Minus implements Expression {
@Override
public int interpret(Context context) {
// TODO Auto-generated method stub
return context.getNumo()-context.getNumt();
}
}
package com.yoodb;
public class Plus implements Expression {
@Override
public int interpret(Context context) {
// TODO Auto-generated method stub
return context.getNumo() + context.getNumt();
}
}
4、单元测试,具体代码如下:
package com.yoodb;
public class MainTest {
public static void main(String[] args) {
int result = new Minus().interpret((new Context(new Plus().interpret(new Context(2015, 8)), 4)));
System.out.println(result);
}
}
运行结果如下:
2019
题2:装饰模式和适配器模式有什么区别?
装饰模式:对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。使用原来被装饰的类的一个子类的实例,把客户端的调用委派到被装饰类。
适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。
从定义上看装饰模式是对核心对象或者功能的扩展,适配器模式是把对象或者功能放到一个新对象中引用。举个例子,现在书城卖道德经的书,有线装版,有精装版,有日文版,有英文版,其中线装版和精装版就是装饰模式,日文版和英文版就是适配器模式,各种版本都是为迎合不同消费者的不同需求。为什么呢?因为线装版和精装版的道德经虽然包装不同,但内容相同,日文版和英文版就不同,这两个版本的内容就可能和原版的不同,文化差异嘛,翻译的内容虽来自道德经,但根据不同国家的文化,思维逻辑什么的就可能改变一些想法。
使用条件
装饰模式一般在下列情况使用:需要扩展一个类的功能或者给你个类增加附加责任;需要动态的给一个对象增加功能,这些功能可以再动态的撤销;需要增加有一些基本功能的排列组合而产生非常大量的功能,从而使得继承关系变得不现实。
适配器模式一般使用的情况包括:系统需要使用现有的类,但此类已经不符合系统的需要;
想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的的类一起工作。适配器模式在系统升级的时候使用的频率很高,对旧系统的一些功能方法在新系统中引用。
题3:Java 中什么是策略模式?
策略模式(strategy)是指把定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式实现需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数。
策略模式中有三个对象:
1)环境对象(Context):该类中实现了对抽象策略中定义的接口或者抽象类的引用。
2)抽象策略对象(Strategy):它可由接口或抽象类来实现。
3)具体策略对象(ConcreteStrategy):它封装了实现同不功能的不同算法。
题4:Java 中简单工厂模式有什么优缺点?
简单工厂模式优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
简单工厂模式缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则。
题5:Java 中代理模式有几种分类?
Java中代理模式有3种分类:
1、静态代理(静态定义代理类)。
2、动态代理(动态生成代理类,也称为Jdk自带动态代理)。
3、Cglib 、javaassist(字节码操作库)。
题6:设计模式的六大原则是什么?
1)开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2)里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3)依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。
4)接口隔离原则(Interface Segregation Principle)
大概意思是指使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5)迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6)合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。
题7:Java 中装饰模式有什么应用场景?
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。
题8:Java 中策略模式有什么应用场景?
策略模式是针对一组算法或逻辑,将每一个算法或逻辑封装到具有共同接口的独立的类中,从而使得它们之间可以相互替换。
实例1:根据不同会员等级打折力度不同的三种策略,初级会员,中级会员,高级会员(三种不同的计算)。
实例2:一个支付模块,要有微信支付、支付宝支付、银联支付等。
实例场景3:张三要到北方做买卖,走之前张三的父亲给仆人三个锦囊,说是危机关头按顺序依次拆开能解决相应的问题。场景中出现三个要素:妙计(具体策略类)、锦囊(环境事件类)、仆人(调用者)。
题9:Java 中单例模式使用时有哪些注意事项?
1、使用时不能用反射模式创建单例,否则会实例化一个新的对象。
2、使用懒单例模式时注意线程安全问题。
3、饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承(如登记式模式)。
题10:设计模式有多少种,都有哪些设计模式?
Java有23种设计模式
设计模式总体分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。