一、接口隔离原则
1.定义
客户端不应该被迫依赖于它不使用的方法;
一个类对另一个类的依赖应该建立在最小的接口上。
简单来说,接口隔离原则 强调:
- 接口应当职责单一,即每个接口只定义一个功能。
- 不要设计臃肿的接口,应当根据功能拆分为多个小接口。
- 避免接口污染,让实现类不需要依赖它们不需要的接口方法。
2.代码举例
在代码中,定义了三个接口:
AntiTheft
(防盗接口)Fireproof
(防火接口)Waterproof
(防水接口)
然后你实现了两个具体的安全门类:
CSDNSafetyDoor
实现了 防盗 和 防火 功能。TheodoreSafetyDoor
实现了 防盗 、防火 和 防水 功能。
java
public interface AntiTheft {
void antiTheft();
}
public interface Fireproof {
void fireproof();
}
public interface Waterproof {
void waterproof();
}
public class CSDNSafetyDoor implements AntiTheft,Fireproof{
@Override
public void antiTheft() {
System.out.println("防盗");
}
@Override
public void fireproof() {
System.out.println("防水");
}
}
public class TheodoreSafetyDoor implements AntiTheft,Fireproof,Waterproof{
@Override
public void antiTheft() {
System.out.println("防盗");
}
@Override
public void fireproof() {
System.out.println("防火");
}
@Override
public void waterproof() {
System.out.println("防水");
}
}
public class Client {
public static void main(String[] args) {
TheodoreSafetyDoor door = new TheodoreSafetyDoor();
door.antiTheft();
door.fireproof();
door.waterproof();
System.out.println("===================================");
CSDNSafetyDoor door1 = new CSDNSafetyDoor();
door1.antiTheft();
door1.fireproof();
}
}
3.代码讲解
(1)职责单一化
- 你的代码很好地遵循了 接口隔离原则 。你将
防盗
、防火
和防水
三个功能分别定义成了三个独立的接口:AntiTheft
、Fireproof
和Waterproof
。 - 这样设计的好处是,每个接口都有其单一的职责,避免了将多个功能混在一个接口中。假设你将所有功能合并到一个大接口
SafetyDoor
中,这样实现类就会被迫实现所有的方法,即使某些功能它并不需要。
(2)灵活性与扩展性
-
通过拆分为多个小接口,当我们需要添加新的安全门产品时,可以自由地选择实现不同的接口,而无需实现不必要的功能。例如,假设我们现在需要一个只有防火功能的安全门,我们可以这样实现:
javapublic class SimpleFireproofDoor implements Fireproof { @Override public void fireproof() { System.out.println("简易防火门"); } }
-
这种设计使得系统具有很强的 灵活性和扩展性,能够轻松地根据需求选择不同的功能组合,而不会影响现有的系统结构。
(3)符合开闭原则
- 接口设计符合 开闭原则 (OCP),系统对扩展开放,对修改封闭。当我们需要添加新的功能(如
防风
功能)时,只需要添加一个新的接口,并在需要的实现类中扩展,而无需修改现有的接口和实现类。
4.总结
- 拆分接口 :将
AntiTheft
、Fireproof
和Waterproof
分离为独立接口,每个接口只定义一个职责,避免了臃肿的大接口。 - 避免实现冗余方法 :具体实现类如
CSDNSafetyDoor
和TheodoreSafetyDoor
只依赖它们需要的接口,不会被迫实现不需要的方法。 - 灵活性和扩展性:可以方便地扩展新的安全门实现类,并选择需要实现的功能接口,而无需修改现有代码,符合开闭原则。
- 客户端代码:在客户端代码中,我们可以根据需求选择不同的实现类,不会因为接口设计而受到限制,提升了系统的可维护性和可扩展性。