Внедрение зависимостей полезно для создания объектов стиля service
.Они имеют следующие характеристики: -
- возможно несколько реализаций,
- тяжелое поведение,
- внутреннее состояние ограничено их зависимостями и, как правило, они не изменяемы
- будет отображаться на актера в реальном мире (например, кассира), а не на вещь
Исходя из этого, Payment
является сервисным объектом.Я бы переименовал его в PaymentService
, чтобы отличить его от записи в бухгалтерской книге, которую вы можете хранить о платеже (который был бы объектом значения).
В вашем примере мало что показывает класс Order
., но я предполагаю, что он будет содержать такую информацию, как некоторые позиции, адрес доставки и общую сумму.Это value
объект.Он представляет собой предмет в бизнес-сфере.
Значимые объекты тяжелы по состоянию и легче по поведению.Возможно несколько реализаций, но вы вряд ли захотите заменить одну реализацию другой.
Объекты-значения не создаются вашей структурой внедрения зависимостей.Они созданы вашим кодом бизнес-логики.В вашем примере вы создаете все объекты, используя Guice.Я ожидаю, что в действительности вам нужно будет создать Order
во время выполнения на основе пользовательского ввода.
Сервисные объекты могут зависеть от объектов-значений, но никак не наоборот.Я думаю, вам следует реализовать:
checkoutService.payfor( order, method );
, а не order.finishOrder( method )
В классе CheckoutService
вы можете выбрать значение PaymentService
и передайте order
ему.CheckoutService
будет принимать в качестве аргументов конструктора PaymentCardPaymentService
(эквивалентно вашему PaymentCardImpl) и CashPaymentService
(эквивалентно вашему PaymentCashImpl).