B类需要方法1
好处是b类继承A类后就有了方法1的功能,问题是B类被迫有了它不使用的方法2
这个其实是根据方法的职责细分接口,只需要依赖其中一个接口就可以了
客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。
下面看一个例子来理解接口隔离原则:安全门案例
我们需要创建一个A品牌的安全门,该安全门具有防火、防水、防盗的功能。可以将防火,防水,防盗功能提取成一个接口,形成一套规范。类图如下:
SafetyDoor安全门接口有全部的功能
package com.lmcode.principles.Interfaceisolationprinciple;
public interface SafetyDoor {
void waterproof();
void fireproof();
void antiTheft();
}
ASafetyDoor
package com.lmcode.principles.Interfaceisolationprinciple;
public class ASafetyDoor implements SafetyDoor{
public void antiTheft() {
System.out.println("防盗");
}
public void fireproof() {
System.out.println("防火");
}
public void waterproof() {
System.out.println("防水");
}
}
BSafetyDoor
package com.lmcode.principles.Interfaceisolationprinciple;
public class BSafetyDoor implements SafetyDoor{
public void antiTheft() {
System.out.println("防盗");
}
@Override
public void waterproof() {
}
public void fireproof() {
System.out.println("防火");
}
}
main
package com.lmcode.principles.Interfaceisolationprinciple;
public class main {
public static void main(String[] args) {
ASafetyDoor a = new ASafetyDoor();
a.antiTheft();
a.fireproof();
a.waterproof();
BSafetyDoor b = new BSafetyDoor();
b.antiTheft();
b.fireproof();
}
}
上面的设计我们发现了它存在的问题,A品牌的安全门具有防盗,防水,防火的功能。现在如果我们还需要再创建一个B品牌的安全门,而该安全门只具有防盗、防水功能呢?很显然如果实现SafetyDoor接口就违背了接口隔离原则,那么我们如何进行修改呢?看如下类图:
AntiTheft
public interface AntiTheft {
void antiTheft();
}
Fireproof
public interface Fireproof {
void fireproof();
}
Waterproof
public interface Waterproof {
void waterproof();
}
ASafetyDoor
public class ASafetyDoor implements AntiTheft,Fireproof,Waterproof {
public void antiTheft() {
System.out.println("防盗");
}
public void fireproof() {
System.out.println("防火");
}
public void waterproof() {
System.out.println("防水");
}
}
BSafetyDoor
public class BSafetyDoor implements AntiTheft,Fireproof {
public void antiTheft() {
System.out.println("防盗");
}
public void fireproof() {
System.out.println("防火");
}
}
标签:antiTheft,原则,软件设计,void,System,接口隔离,println,public,out
From: https://www.cnblogs.com/lm02/p/18200591