Как правильно спроектировать замену классов?
Заменить классы на интерфейсы, передавать в "обработчик" экземпляр класса, реализующего интерфейс параметром. https://habr.com/ru/post/350068/
В php, если ты не проводишь контроль типов используемых экземпляров объектов, методы вызываются по имени, как есть, т.е. достаточно чтобы класс экземпляра объекта имел методы с теми же именами что у тебя используются, и совместимым порядком параметров, и все будет работать.

Ну а если ты везде тип контролируешь, используй паттерн интерфейс-реализация, указывая в качестве типов - интерфейс.