接口隔离原则(ISP):
客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。不应该强迫客户依赖于它们不用的方法。
ISP的几个使用原则
根据接口隔离原则拆分接口时,首先必须满足单一职责原则:
没有哪个设计可以十全十美的考虑到所有的设计原则,有些设计原则之间就可能出现冲突,就如同单一职责原则和接口隔离原则,一个考虑的是接口的职责的单一性,一个考虑的是方法设计的专业性(尽可能的少),必然是会出现冲突。
在出现冲突时,尽量以单一职责为主,当然这也要考虑具体的情况。
提高高内聚:
提高接口,类,模块的处理能力,减少对外的交互。比如你给杀手提交了一个订单,要求他在一周之内杀一个人,一周后杀手完成了任务,这种不讲条件完成任务的表现就是高内聚。
具体来说就是:要求在接口中尽量少公布public方法,接口是对外的承诺,承诺越少对系统的开发越有利,变更的风险就越小,也有利于降低成本。
定制服务: 单独为一个个体提供优良服务(只提供访问者需要的方法)。
接口设计要有限度: 根据经验判断。
案例1:
未遵守接口隔离原则
安全门案例
我们需要创建一个黑马品牌的安全门,该安全门具有防火、防水、防盗的功能。可以将防火,防水,防盗功能提取成一个接口,形成一套规范。
类图
安全门接口
/**
* @Description: 安全门接口
*/
public interface SafetyDoor {
//防盗
void antiTheft();
//防火
void fireProof();
//防水
void waterProof();
}
黑马品牌安全门的类
/**
* @Description: 黑马品牌的安全门
*/
public class HeimaSafetyDoor implements SafetyDoor {
public void antiTheft() {
System.out.println("防盗");
}
public void fireProof() {
System.out.println("防火");
}
public void waterProof() {
System.out.println("防水");
}
}
测试类
/**
* 测试类
*/
public class Client {
public static void main(String[] args) {
HeimaSafetyDoor door = new HeimaSafetyDoor();
door.antiTheft();
door.fireProof();
door.waterProof();
}
}
测试结果:
解释说明:
上面的设计我们发现了它存在的问题,黑马品牌的安全门具有防盗,防水,防火的功能。
现在如果我们还需要再创建一个传智品牌的安全门,而该安全门只具有防盗、防水功能呢?
很显然如果实现SafetyDoor接口就违背了接口隔离原则,那么我们如何进行修改呢?
案例2:
使用接口隔离原则
类图:
防盗接口
/**
* @Description: 防盗接口
*/
public interface AntiTheft {
void antiTheft();
}
防火接口
/**
* @Description: 防火接口
*/
public interface Fireproof {
void fireproof();
}
防水接口
/**
* @Description: 防水接口
*/
public interface Waterproof {
void waterproof();
}
黑马品牌的安全门类(使用到三个功能方法就实现三个接口)
/**
* 黑马品牌的安全门
*/
public class HeiMaSafetyDoor implements AntiTheft,Fireproof,Waterproof {
public void antiTheft() {
System.out.println("防盗");
}
public void fireproof() {
System.out.println("防火");
}
public void waterproof() {
System.out.println("防水");
}
}
传智品牌的安全门(只用到两个功能方法就实现两个接口)
/**
* @Description: 传智安全门
*/
public class ItcastSafetyDoor implements AntiTheft,Fireproof {
public void antiTheft() {
System.out.println("防盗");
}
public void fireproof() {
System.out.println("防火");
}
}
测试类
/**
* 测试类
*/
public class Client {
public static void main(String[] args) {
//创建黑马安全门对象
HeimaSafetyDoor door = new HeimaSafetyDoor();
//调用功能
door.antiTheft();
door.fireProof();
door.waterProof();
System.out.println("============");
//创建传智安全门对象
ItcastSafetyDoor door1 = new ItcastSafetyDoor();
//调用功能
door1.antiTheft();
door1.fireproof();
}
}
测试结果
解释说明:
使用不同的接口定义不同的功能方法,当新增的品牌只用到哪几个功能方法时,只需要实现对应的接口即可,就不会依赖它不需要的功能方法。
结束!!!!!!!
你看,那个人好像一个条狗。