文章目录
- 3.4 接口隔离原则(ISP)
- 3.4.1 概述
- 3.4.2 案列
3.4 接口隔离原则(ISP)
Interface Segregation Principle,简称ISP
3.4.1 概述
客户端测试类不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。
3.4.2 案列
面看一个例子来理解接口隔离原则:
【例】安全门案例
需求:创建一个学校品牌的安全门,该安全门具有防火、防水、防盗的功能。可以将防火,防水,防盗功能提取成一个接口,形成一套规范。类图如下:
// 防盗门
public interface SafetyDoor {
//防盗功能
public abstract void antiTheft();
// 防火功能
public abstract void fireproof();
// 防水功能
public abstract void waterproof();
}
==========================================================
//学校防盗门类 实现防盗门接口
public class SchoolDoor implements SafetyDoor {
@Override
public void antiTheft() {
System.out.println("防盗");
}
@Override
public void fireproof() {
System.out.println("防火");
}
@Override
public void waterproof() {
System.out.println("防水");
}
}
============================================================
public class ClientTest {
public static void main(String[] args) {
// 创建学校防盗门对象
SchoolDoor schoolDoor = new SchoolDoor();
// 调用方法实现防盗门的功能
schoolDoor.antiTheft();
schoolDoor.waterproof();
schoolDoor.fireproof();
}
}
上述代码看似实现了需求的功能,但是如果加入新增一个家庭品牌的安全门,有防盗功能和防火功能,此时如果再定义一个家庭安全门类去实现安全门的接口会造成家庭安全门被迫去实现防水功能,这就违背了接口隔离原则。
根据接口隔离原则,改进如下:
// 防盗接口
public interface AntiTheft {
public abstract void antiTheft();
}
===========================================================
// 防火接口
public interface Fireproof {
public abstract void fireproof();
}
===========================================================
// 防水接口
public interface Waterproof {
public abstract void waterproof();
}
==========================================================
//创建学校防盗门,实现该有功能的接口
nmpublic class SchoolDoor 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 HomeDoor implements AntiTheft,Fireproof{
@Override
public void antiTheft() {
System.out.println("防盗");
}
@Override
public void fireproof() {
System.out.println("防火");
}
}
===========================================================
public class ClientTest {
public static void main(String[] args) {
// 创建学校防盗门
SchoolDoor s = new SchoolDoor();
// 实现学校防盗门功能
s.fireproof();
s.waterproof();
s.antiTheft();
// 创建家庭品牌安全门
HomeDoor homeDoor = new HomeDoor();
//实现家庭品牌安全门的功能
homeDoor.antiTheft();
homeDoor.fireproof();
}
}