[设计模式] 浅谈接口隔离原则

2024 年 4 月 16 日 星期二
/ ,
8

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

接口隔离原则

原则说明:接口隔离原则(Interface Segregation Principle,ISP), 客户端不应该被迫依赖于它不使用的接口,或者说,类间的依赖关系应该建立在最小的接口上。

为什么要遵守该原则

该原则是为了让系统解开耦合,从而容易重构,更改和重新部署。

用一个简单的例子说明

假设我们有一个打印机接口,它有打印、扫描和复印三个方法

public interface Printer {
    void print();
    void scan();
    void copy();
}

现在我们有一个只支持打印的打印机类

public class SimplePrinter implements Printer {
    @Override
    public void print() {
        // 实现打印
    }

    @Override
    public void scan() {
        // 不支持扫描,但由于接口定义了这个方法,所以不得不实现
    }

    @Override
    public void copy() {
        // 不支持复印,但由于接口定义了这个方法,所以不得不实现
    }
}

这就违反了接口隔离原则,因为SimplePrinter被迫实现了它不需要的scan和copy方法。
正确的做法是

public interface Printer {
    void print();
}

public interface Scanner {
    void scan();
}

public interface Copier {
    void copy();
}
public class SimplePrinter implements Printer {
    @Override
    public void print() {
        // 实现打印
    }
}

与单一职责的区别

回顾一下单一职责原则。链接就会发现,这两个特别像。 那么区别是什么?

  1. 单一职责原则强调的是类和模块的职责划分。它要求一个类或者模块只负责一项职责,这样做的好处是当这项职责发生变化时,只需要修改这个类或模块,不会影响到其他的功能。
  2. 接口隔离原则则是从接口的角度来看待问题。它要求我们在设计接口时,应该尽量细化接口,让接口尽可能小。这样做的好处是降低了类之间的耦合度,提高了代码的灵活性。
  3. 单一职责原则主要是为了代码的可维护性,而接口隔离原则主要是为了代码的可复用性。

如何运用好接口隔离原则

  1. 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计的灵活性,但是如果过小,则会造成接口数量剧增,使设计复杂化,因此一定要适度。
  2. 为依赖接口的类定制服务,只暴露调用类需要的方法,它不需要的方法则隐藏起来。只有专注为一个模块提供定制服务,才能建立最小的依赖关系。
  3. 提高内聚,减少对外交互,使接口用最少的方法完成最多的事情。
  4. 运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些实践去思考和筹划,才能准确地实践这一原则。
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...