以前,我们深入研究了坚实的原则,包括单一责任和开放/封闭原则。
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 {@Overridepublic 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