定义
- 客户端不应该依赖它不需要的接口。
- 类间的依赖关系应该建立在最小的接口上。
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();
}