以前,我们深入研究了坚实的原则,包括单一责任和开放/封闭原则。
Liskov替代原则(LSP)是子类型关系的一种特殊定义,称为(强)行为子类型,
假设对象S是对象T的子类型,则可以用类型S的对象替换类型T的对象,而无需更改T的任何理想属性。
假设我们有Employee类。
package com.gkatzioura.solid.liskov;
public class Employee {
public void work() {
System.out.println("Employee is working");
}
}
我们还有另一个继承Employee类的类。
package com.gkatzioura.solid.liskov;
public class EmployeeOnVacation extends Employee {
@Override
public void work() {
throw new IllegalArgumentException("Employees on vacation should not work");
}
}
假设我们有一个项目。
package com.gkatzioura.solid.liskov;
import java.util.List;
public class Project {
public void start(List<Employee> employees) {
for(Employee employee:employees) {
employee.work();
}
}
}
我们指派员工开始研究
List<Employee> employees = new ArrayList<>();
employees.add(new EmployeeOnVacation());
employees.add(new Employee());
Project project = new Project();
project.start(employees);
由于雇员正在休假,结果将是一个例外,因此该项目将无法完成。
为了避免违反该原则,我们将使用不同的方法并建立两个不同的员工界面。
WorkingEmployee接口。
package com.gkatzioura.solid.liskov;
public interface WorkingEmployee {
public void work();
}
和非工作人员界面。
package com.gkatzioura.solid.liskov;
public interface NonWorkingEmployee {
void relax();
}
因此,该项目将仅使用作为WorkingEmployee接口的实现的员工。
List<WorkingEmployee> employees = new ArrayList<>();
employees.add(new WorkingEmployeeImpl());
Project project = new Project();
project.start(employees);
您可以在github上找到源代码。 下一个原则是接口隔离原则。
另外,我还编写了备忘单,其中包含一些扎实的原则。
在链接中注册以接收它。
翻译自: https://www.javacodegeeks.com/2018/02/solid-principles-liskov-substitution-principle.html