[设计模式] 浅谈接口隔离原则
接口隔离原则
原则说明:接口隔离原则(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() {
// 实现打印
}
}
与单一职责的区别
回顾一下单一职责原则。链接就会发现,这两个特别像。 那么区别是什么?
- 单一职责原则强调的是类和模块的职责划分。它要求一个类或者模块只负责一项职责,这样做的好处是当这项职责发生变化时,只需要修改这个类或模块,不会影响到其他的功能。
- 接口隔离原则则是从接口的角度来看待问题。它要求我们在设计接口时,应该尽量细化接口,让接口尽可能小。这样做的好处是降低了类之间的耦合度,提高了代码的灵活性。
- 单一职责原则主要是为了代码的可维护性,而接口隔离原则主要是为了代码的可复用性。
如何运用好接口隔离原则
- 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计的灵活性,但是如果过小,则会造成接口数量剧增,使设计复杂化,因此一定要适度。
- 为依赖接口的类定制服务,只暴露调用类需要的方法,它不需要的方法则隐藏起来。只有专注为一个模块提供定制服务,才能建立最小的依赖关系。
- 提高内聚,减少对外交互,使接口用最少的方法完成最多的事情。
- 运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些实践去思考和筹划,才能准确地实践这一原则。