Это позволит нам заменить switch на полиморфизм. Правда, есть небольшая неприятность: это не будет работать. Фильмы могут менять классификацию в процессе жизни (например, из новинки стать обычным или детским фильмом). Но ведь объекты не могуг изменять свой тип в процессе жизни. К счастью, у этой проблемы есть решение, паттерн State, разработанный "Бандой четырёх" (Gang of Four). При этом наши классы будут выглядеть следующим образом (см. Рис 1.15)
Рис 1.14 Наследование от класса Movie
Отвязав класс Movie от его, мы можем строить иерархию классов от объекта Price и менять цену в любое время.
Рис 1.15 Применение паттерна State к классу Movie
Если вы хорошо знакомы с паттернами "Банды четырех", то, возможно, у вас возникнет
сомнение: "Это State или Strategy?" Представляет ли класс Price алгоритм для
расчёта цены (в этом случае я предпочёл бы назвать его Pricer или PricingStrategy),
или же он представляет статус фильма (
Чтобы перейти к паттерну State, нам придётся применить три рефакторинга. Первым делом переместим код типа фильма в паттерн State, применив рефакторинг Replace Type Code with State/Strategy (227). После этого используем Move Method (142), чтобы переместить switch в класс Price. И, наконец, используем Replace Conditional with Polymorphism (255), чтобы избавиться от switch.
В начало | предыдущая | следующая