一 点睛
客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。
二 需求
安全门案例:我们需要创建一个黑马
品牌的安全门,该安全门具有防火、防水、防盗的功能。可以将防火,防水,防盗功能提取成一个接口,形成一套规范。
三 反例
1 类图
2 代码
SafetyDoor
public interface SafetyDoor {
// 防盗
void antiTheft();
// 防火
void fireProof();
// 防水
void waterProof();
}
HeimaSafetyDoor
public class HeimaSafetyDoor implements SafetyDoor {
public void antiTheft() {
System.out.println("防盗");
}
public void fireProof() {
System.out.println("防火");
}
public void waterProof() {
System.out.println("防水");
}
}
Client
public class Client {
public static void main(String[] args) {
HeimaSafetyDoor door = new HeimaSafetyDoor();
door.antiTheft();
door.fireProof();
door.waterProof();
}
}
3 测试
防盗
防火
防水
4 分析
上面的设计我们发现了它存在的问题,黑马品牌的安全门具有防盗,防水,防火的功能。现在如果我们还需要再创建一个传智品牌的安全门,而该安全门只具有防盗、防水功能呢?很显然如果实现SafetyDoor接口就违背了接口隔离原则,那么我们如何进行修改呢?
四 正例
1 类图
2 代码
AntiTheft(接口):
public interface AntiTheft {
void antiTheft();
}
Fireproof(接口):
public interface Fireproof {
void fireproof();
}
Waterproof(接口):
public interface Waterproof {
void waterproof();
}
HeiMaSafetyDoor(类):
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("防水");
}
}
ItcastSafetyDoor(类):
public class ItcastSafetyDoor implements AntiTheft,Fireproof {
public void antiTheft() {
System.out.println("防盗");
}
public void fireproof() {
System.out.println("防火");
}
}
Client(类):
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();
}
}
3 测试
防盗
防火
防水
============
防盗
防火