17. Спринг сервис. Идеи по улучшению кода. Как сделать так, чтобы при добавлении нового робота Spring сразу создавал нового робота и нам не пришлось работать ручками #
@Component
public class Robot1 {
public void startWork() {
// помыть полы
}
}
@Component
public class Robot2 {
public void startWork() {
// почистить стены
}
}
@Component
public class Robot3 {
public void startWork() {
// играет в футбол
}
}
@Service
public class RobotProcessing {
@Autowired
private Robot1 r1;
@Autowired
private Robot2 r2;
@Autowired
private Robot3 r3;
public void startAllRobots() {
r1.startWork();
r2.startWork();
r3.startWork();
}
}
Спойлеры к решению
Подсказки
🤖 Проблема в том, что при добавлении нового робота нужно вручную менять код в
⚙️ Можно использовать список
📌 Интерфейс поможет сделать код гибким и расширяемым.
RobotProcessing
.⚙️ Можно использовать список
List<Robot>
или Map<String, Robot>
, чтобы Spring автоматически собирал всех бинов-роботов.📌 Интерфейс поможет сделать код гибким и расширяемым.
Решение
public interface Robot {
void startWork();
}
@Component
public class Robot1 implements Robot {
@Override
public void startWork() {
System.out.println("Robot1 моет полы");
}
}
@Component
public class Robot2 implements Robot {
@Override
public void startWork() {
System.out.println("Robot2 чистит стены");
}
}
@Component
public class Robot3 implements Robot {
@Override
public void startWork() {
System.out.println("Robot3 играет в футбол");
}
}
@Service
public class RobotProcessing {
private final List<Robot> robots;
@Autowired
public RobotProcessing(List<Robot> robots) {
this.robots = robots;
}
public void startAllRobots() {
robots.forEach(Robot::startWork);
}
}
📌 Объяснение:
- Добавили интерфейс
Robot
, чтобы все роботы его реализовывали. - Используем
List<Robot>
вRobotProcessing
, и Spring автоматически находит все реализацииRobot
. - Теперь можно просто создать новый класс с
@Component
, и Spring сам его добавит в список!
🔥 Преимущества:
✅ Гибкость — не нужно изменять RobotProcessing
при добавлении нового робота.
✅ Инкапсуляция — RobotProcessing
не зависит от конкретных классов роботов.
✅ Меньше кода и ошибок 🚀