Ранее мы погрузились в прочные принципы, включая единую ответственность и принцип открытого / закрытого типа .
Принцип подстановки Лискова (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, являются их собственными. |