Код написан по книге O'Relly

https://www.ozon.ru/context/detail/id/20216992/

Принципы проектирования:

  1. Инкапсулируйте то что изменяете
  2. Предпочитайте композицию наследованию
  3. Программируйте на уровне интерфейсов
  4. Стремитесь к слабой связанности взаимодействующих объектов
  5. Классы должны быть открыты для расширения и закрыты для изменения
  6. Принцип инверсии зависимостей: Код должен зависеть от абстракций, а не от конкретных зависимостей
  7. Принцип минимальной информированности: общайтесь только с близкими друзьями(чтобы не приводить к каскадным изменениям системы)
  8. Голливудский принцип: не вызывайте нас - мы вас сами вызовем(необходимо избегать циклических зависимостей)
  9. Класс должен иметь только одну причину для изменения