Skip to content
On this page

接口隔离原则

  • 客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上

例:

假设制造一款手机,需要有防水和防尘功能。可以将防水和防尘功能提取成一个接口,形成一套规范,其UML类图如下

image-20220911233047907

根据以上类图的设计不难发现其中的问题,摩托手机具有防水和防尘功能。但是现在要求我们制造只有防水功能的Lenovo手机,但是MobileFunction接口提供多余了dust防尘功能是Lenovo不需要的,Levono直接聚合MobileFunction的话就违背了接口隔离原则

针对以上存在的问题,我们的改进思路,即:将防水和防尘的功能都独立出来,需要哪款手机需要防水就实现防水接口,需要防尘功能就实现防尘接口。改进后的UML图如下

image-20220911233418332

代码:

防尘功能接口

java
package com.huangjiliang.design.heima.principle.demo4;

/**
 * 防尘功能接口
 */
public interface DustFunction {

    void dust();

}

防水功能接口

java
package com.huangjiliang.design.heima.principle.demo4;

/**
 * 防水功能接口
 */
public interface WaterproofFunction {

    void waterproof();

}

摩托手机(拥有防尘和防水功能)

java
package com.huangjiliang.design.heima.principle.demo4;

/**
 * 摩托手机
 * 实现防水和防尘接口,拥有防尘和防水功能
 */
public class MotorMobile implements DustFunction, WaterproofFunction{

    @Override
    public void dust() {
        System.out.println("防尘功能!");
    }

    @Override
    public void waterproof() {
        System.out.println("防水功能!");
    }
}

联想手机(拥有防水功能)

java
package com.huangjiliang.design.heima.principle.demo4;

/**
 * 联想手机,只有防水功能
 */
public class LenovoMobile implements WaterproofFunction{

    @Override
    public void waterproof() {
        System.out.println("防水功能!");
    }
}

总结

  • 接口隔离原则精髓在于细化接口功能,虽然这样会多出很多的接口类,但是可以降低代码耦合度,减少多余的代码,易于理解