Ранее мы погрузились в прочные принципы, включая единую ответственность и принцип открытого / закрытого типа .
Принцип подстановки Лискова (LSP) — это конкретное определение отношения подтипа, называемое (сильным) поведенческим подтипом,
Предположим, что объект S является подтипом объекта T, тогда объекты типа T могут быть заменены объектами типа S без изменения каких-либо желательных свойств T.
Предположим, у нас есть класс Employee.
|
01
02
03
04
05
06
07
08
09
10
|
package com.gkatzioura.solid.liskov;public class Employee { public void work() { System.out.println("Employee is working"); }} |
Также у нас есть другой класс, который наследует класс Employee.
|
1
2
3
4
5
6
7
8
9
|
package com.gkatzioura.solid.liskov;public class EmployeeOnVacation extends Employee { @Override public void work() { throw new IllegalArgumentException("Employees on vacation should not work"); }} |
Предположим, что у нас есть проект.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
package com.gkatzioura.solid.liskov;import java.util.List;public class Project { public void start(List<Employee> employees) { for(Employee employee:employees) { employee.work(); } }} |
И мы поручаем нашим сотрудникам начать работать над этим
|
1
2
3
4
5
6
|
List<Employee> employees = new ArrayList<>(); employees.add(new EmployeeOnVacation()); employees.add(new Employee()); Project project = new Project(); project.start(employees); |
Результат будет исключением из-за работника, который находится в отпуске, и поэтому проект не будет завершен.
Чтобы не нарушать принцип, мы будем использовать другой подход и создадим два разных интерфейса для сотрудников.
Интерфейс WorkingEmployee.
|
1
2
3
4
5
6
|
package com.gkatzioura.solid.liskov;public interface WorkingEmployee { public void work();} |
И интерфейс не работающего сотрудника.
|
1
2
3
4
5
6
|
package com.gkatzioura.solid.liskov;public interface NonWorkingEmployee { void relax();} |
Таким образом, в проекте будут использоваться только те сотрудники, которые являются реализациями интерфейса WorkingEmployee.
|
1
2
3
4
|
List<WorkingEmployee> employees = new ArrayList<>(); employees.add(new WorkingEmployeeImpl()); Project project = new Project(); project.start(employees); |
Вы можете найти исходный код на github . Следующий принцип — принцип сегрегации интерфейса .
Также я составил шпаргалку, содержащую краткое изложение основных принципов.
Зарегистрируйтесь в ссылке, чтобы получить его.
| Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. Смотреть оригинальную статью здесь: Твердые принципы: принцип замещения Лискова
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |