Java面试集锦(一)之设计模式

  • 作者: 凯哥Java
  • 面试宝典
  • 时间:2020-08-04 22:10
  • 122人已阅读
简介 设计模式1.原则1.单一职责原则单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。解释:如果一个类职责过多,就等于把这些职责耦合在一起;软件设计正在要做的许多内容,就是发现职责并把那些职责分离;如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个职责,就应该考虑类的职责分离;2.开放-封闭原则开放-封闭原则,是说软件实体(类、模块、函数等)应该可以扩展,但是不可修改。解释:这

设计模式

1. 原则

1. 单一职责原则
单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。
解释:

  • 如果一个类职责过多,就等于把这些职责耦合在一起;

  • 软件设计正在要做的许多内容,就是发现职责并把那些职责分离;

  • 如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个职责,就应该考虑类的职责分离;

2. 开放-封闭原则
开放-封闭原则,是说软件实体(类、模块、函数等)应该可以扩展,但是不可修改。
解释:

  • 这个原则有两个特征,对于扩展是开放的(Open for extension),对于更改是封闭的(Close for modification)。
    面对。

  • 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。

3. 依赖倒转原则
A. 高层模块不应该依赖低层模块,两个都应该依赖抽象;
B. 抽象不应该依赖细节,细节应该依赖抽象。
解释:

  • 要针对接口编程,不要对实现编程。

  • 依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之就是过程化设计了。

4. 里氏代换原则
子类型必须能够替换掉它们的父类型。
解释:

  • 只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能正在被复用,而子类也能够在父类的基础上增加新的行为。
    单一职责原则:高内聚,一个类只做它该做的事情;

5. 接口隔离原则: 接口小而专,避免大而全;

6. 迪米特法则:高内聚,低耦合;

2. 设计模式

1.创建型模式

  1. 抽象工厂模式:提供了一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类

  2. 建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示

  3. 工厂方法模式:将类的实例化操作延迟到子类完成,即由子类来决定究竟应该实例化哪一个类

  4. 单例模式:确保在系统中某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例

2.结构型模式

  1. 适配器模式:将一个接口转换成客户希望的另一个接口,从而使接口不兼容的哪些类可以一起工作

  2. 桥接模式:将抽象部分与他的实现部分分离,使他们都可以独立的进行变化

  3. 装饰模式:动态给一个对象增加一些额外的职责

  4. 代理模式:给某一个对象提供一个代理,并由代理对象控制对原对象的引用

3.行为型模式

  1. 职责链模式:避免请求发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止

  2. 迭代器模式:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示

  3. 策略模式:定义一系列算法,并将每一个算法封装在一个类中,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化

  4. 模板方法:定义一个操作中算法的骨架,而将这一些步骤延迟到子类中

3.单例模式

需要:
(1)将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
(2)在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。
(3)定义一个静态方法返回这个唯一对象。

实现一:立即加载 / “饿汉模式”
“饿汉模式”的优缺点:
优点:实现起来简单,没有多线程同步问题。
缺点:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

实现二:延迟加载 / “懒汉模式”
“懒汉模式”的优缺点:
优点:实现起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存。
缺点:在多线程环境中,这种实现方法是完全错误的,根本不能保证单例的状态。

package singletion;

/**
 * @author WangXiaoeZhe
 * @Date: Created in 2019/9/2 11:46
 * @description:
 */

public class Singleton {
    /**
     * 饿汉式
     */

    private static Singleton instance = new Singleton();

   /* private Singleton(){}
    static Singleton getInstance() {
        return instance;
    }*/


    /**
     * 懒汉式
     */


    private static Singleton instence = null;

    private Singleton() {
    }

    static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

}

4.JDK中的设计模式

  1. 单例模式:RuntimeException

  2. 静态工厂:Integer a = Integer.valueOf(int or String)

  3. 迭代器模式:Collection.iterator()

  4. 适配器模式:InputStreamReader和outputStreamWriter

  5. 装饰器模式:Reader 和 bufferdReader

  6. 代理模式: SpringAOP

  7. 工厂模式:SpringIoc

适配器模式:将一个接口适配到另一个接口,Java I/O中InputStreamReader将Reader类适配到InputStream,从而实现了字节流到字符流的准换。
装饰者模式:保持原来的接口,增强原来有的功能。
FileInputStream 实现了InputStream的所有接口,BufferedInputStreams继承自FileInputStream是具体的装饰器实现者,将InputStream读取的内容保存在内存中,而提高读取的性能。


Top Top