Какой шаблон лучше подходит для избавления от множества if? Привет В программе есть куча обьектов различных классов (самолеты, катера, вертолеты, танки, машины, грузовики), которые подключают различные интерфейсы (ехать, лететь, стрелять, перевозить). Соответсвенно в коде надо использовать кучу условий чтобы понять что за обьекто и какой метод можно вызвать:foreach($vehicles as $vehicle) { switch($vehicle->type) { case 'car': $vehicle->move(); $vehicle->closeDoor(); break; case 'ship': $vehicle->move(); $vehicle->swim(); break; case 'airplane': $vehicle->fly(); $vehicle->landing(); break; case 'tank': $vehicle->move(); $vehicle->stop(); $vehicle->fire(); break; } $vehicle->stop(); } Не могу понять какую лучше использовать технику чтобы избавится от кучи if в программе ? тк методы у обьекта могут быть разные полиморфизм не подходит, надо точно знать обьект какого класса используется.
Для избавления от множества if-ов в данном случае можно применить паттерн "Стратегия" (Strategy).
Суть этого паттерна заключается в том, что каждый тип вида перевозки (автомобиль, корабль, самолет, танк и т.д.) имеет свой собственный класс, реализующий один интерфейс, например, интерфейс "TransportStrategy". В этом интерфейсе есть методы, общие для всех видов транспорта, например, move(), stop(), fire(), swim() и т.д.
Каждый класс транспорта (автомобиль, корабль, самолет, танк и т.д.) реализует свою конкретную стратегию этих методов. Например, у класса "Car" метод move() будет реализован для езды по дороге, у класса "Ship" метод move() будет реализован для плавания по воде и т.д.
Теперь в вашем коде можно использовать этот паттерн следующим образом:
foreach($vehicles as $vehicle) { $strategy = new TransportStrategyFactory($vehicle); $strategy->move(); $strategy->stop(); $strategy->executeSpecificAction(); }
Таким образом, при добавлении новых классов транспорта и методов, вам не придется изменять большое количество if-ов, а просто добавить новую конкретную стратегию в соответствующем классе.
Этот подход также позволяет легко тестировать каждый класс транспорта отдельно и обеспечивает гибкость и расширяемость вашей системы.
Для избавления от множества if-ов в данном случае можно применить паттерн "Стратегия" (Strategy).
Суть этого паттерна заключается в том, что каждый тип вида перевозки (автомобиль, корабль, самолет, танк и т.д.) имеет свой собственный класс, реализующий один интерфейс, например, интерфейс "TransportStrategy". В этом интерфейсе есть методы, общие для всех видов транспорта, например, move(), stop(), fire(), swim() и т.д.
Каждый класс транспорта (автомобиль, корабль, самолет, танк и т.д.) реализует свою конкретную стратегию этих методов. Например, у класса "Car" метод move() будет реализован для езды по дороге, у класса "Ship" метод move() будет реализован для плавания по воде и т.д.
Теперь в вашем коде можно использовать этот паттерн следующим образом:
foreach($vehicles as $vehicle) {$strategy = new TransportStrategyFactory($vehicle);
$strategy->move();
$strategy->stop();
$strategy->executeSpecificAction();
}
Таким образом, при добавлении новых классов транспорта и методов, вам не придется изменять большое количество if-ов, а просто добавить новую конкретную стратегию в соответствующем классе.
Этот подход также позволяет легко тестировать каждый класс транспорта отдельно и обеспечивает гибкость и расширяемость вашей системы.