面试过程中可能会问及一些设计模式相关的问题,这一类主要是看你写代码时的思考,是否能写出更好的代码、最好根据结合实际业务情况说一两个例子。说说使用了xxx设计模式之后能解决xxx问题。下面总结一些基础问题及其相应的可能的回答。只是一个例子,设计模式这一块需要有自己的思考。但是需要有一些标准指导,比如六大原则两大标准之类的。
设计原则
面向对象:
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种优化,操作起来更加的方便,简化了过程。
面向对象有三大特征:封装性、继承性、多态性
其中封装性指的是隐藏了对象的属性和实现细节,仅对外提供公共的访问方式,这样就隔离了具体的变化,便于使用,提高了复用性和安全性。
对于继承性,就是两种事物间存在着一定的所属关系,那么继承的类就可以从被继承的类中获得一些属性和方法;这就提高了代码的复用性。继承是作为多态的前提的。
多态是说父类或接口的引用指向了子类对象,这就提高了程序的扩展性,也就是说只要实现或继承了同一个接口或类,那么就可以使用父类中相应的方法,提高程序扩展性,但是多态有一点不好之处在于:父类引用不能访问子类中的成员。
两大标准: 高内聚、低耦合
六大原则:
-
单一原则(职责单一)
一个方法只干一件事
一个接口只干一个事… -
里氏替换原则(抽象和继承)
子类必须完全实现父类的方法
子类可以有自己的个性
覆盖/实现父类方法时,入参可被放大
覆盖/实现父类方法时,输出可缩小 -
依赖倒置原则(面向接口编程)
高层模块不该依赖低层模块,二者都应该依赖其抽象;
抽象不应该依赖于细节 -
接口隔离原则(接口最小化)
只依赖需要的接口,依赖的接口最小化
-
迪米特法则(降低类与类的耦合)
类与类之间应保持最小的了解
-
开闭原则(对拓展开放,对修改关闭)
软件需要变化时,尽量通过拓展软件实体的行为来实现变化,而不是通过修改已有代码
常用设计模式
根据个人实际使用情况说明即可,但是自己说出的设计模式一定要熟悉,能说出个门道来.最好是自己结合自己的项目来讲讲用这个设计模式带来的好处. 所有的设计模式可以参考 菜鸟教程-设计模式。 以下简单举例几个设计模式.
-
单例模式
定义: 一个类有且仅有一个实例,并且自行实例化向整个系统提供。
作用: 一般是针对一些创建对象时比较消耗资源的情况.使用单例模式可以减少系统开销。
实现方式: 懒汉模式、饿汉模式
手写代码:public class Singleton { // 私有构造 private Singleton () {} // 静态内部类 private static class SingletonHolder { private static final Singleton INSTANCE= new Singleton(); } // JVM的类加载机制确保该方法没有线程安全问题 public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }
-
创建者模式
定义: 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
作用: 创建者模式隐藏了复杂对象的创建过程,通常用于常见复杂对象
eg. HttpClientBuilder -
责任链模式
定义: 使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
作用: 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了
eg. servlet中的filter -
策略模式
定义: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换
作用: 在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护
eg. 代收邮件,定义代收行为。实际策略有imap,pop,aws等多种 -
模板方法模式
定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤
作用: 灵活地实现具体的算法,满足用户灵活多变的需求。
eg. JDK中的基于AQS实现的一些工具类,如CountDownLatch
Spring的IOC和AOP原理是啥
So easy. 十分基础的问题,知道即可.
-
IOC
控制反转,原理就是使用了JDK的反射,直接容器帮你构造实体bean.
反射的话可能还会问问反射的相关方法. 这个自行去看JDK. -
AOP
面向切面编程,其原理就是通过动态代理。最常见的使用场景就是日志记录,比如需要记录每个方法的请求耗时等。
待续