定义
- 客户端不应该依赖它不需要的接口。
- 类间的依赖关系应该建立在最小的接口上。
Clients should not be forced to depend upon interfaces that they don`t use.
The dependency of one class to another one should depend on the smallest possible.
接口隔离原则和单一职责的区别
接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:
- 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
- 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。
接口隔离原则的实现方法
在具体应用接口隔离原则时,应该根据以下几个规则来衡量。
- 根据接口隔离原则拆分接口时,首先必须满足单一职责原则。
- 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
- 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
- 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。
- 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
案例:咖啡机
咖啡厅里面有咖啡机,操作咖啡机的有两种人,分别是客户和员工。
客户选择咖啡类型和加糖量就可以做咖啡了。员工负责维护咖啡机,负责清洗机器,往咖啡机中加水,加咖啡豆等日常事项。
所以先定义咖啡机的接口有如下功能:
public interface CoffeeMachine {// 选择咖啡类型void selectCoffeeType();// 选择加糖量void selectSugarAmount();// 做咖啡void makeCoffee();// 清洗机器void cleanMachine();// 装咖啡豆void fillCoffeeBeans();// 往咖啡机中装水void fillWater();// 往咖啡机中装糖void fillSugar();}
然后分别是客户和员工来使用咖啡机:
// 客户类public class Customer {CoffeeMachine coffeeMachine;public void setCoffeeMachine(CoffeeMachine coffeeMachine) {this.coffeeMachine = coffeeMachine;}// 客户做咖啡public void makeCoffee() {// 选择类型coffeeMachine.selectCoffeeType();// 选择加糖量coffeeMachine.selectSugarAmount();// 制作咖啡coffeeMachine.makeCoffee();}}// 员工类public class Staff {CoffeeMachine coffeeMachine;public void setCoffeeMachine(CoffeeMachine coffeeMachine) {this.coffeeMachine = coffeeMachine;}public void work() {// 清洗机器coffeeMachine.cleanMachine();// 加入咖啡豆coffeeMachine.fillCoffeeBeans();// 加糖coffeeMachine.fillSugar();// 加水coffeeMachine.fillWater();}}
如何优化上述代码?
明显我们的接口定义的方法太大了,客户不需要的方法很多,客户不需要进行清洗机器等操作,因此我们把客户和员工操作咖啡机的方法分别进行定义即可。
public interface ICoffeeMachineCustomer {// 选择咖啡类型void selectCoffeeType();// 选择加糖量void selectSugarAmount();// 做咖啡void makeCoffee();}public interface ICoffeeMachineStaff {// 清洗机器void cleanMachine();// 装咖啡豆void fillCoffeeBeans();// 往咖啡机中装水void fillWater();// 往咖啡机中装糖void fillSugar();}
