Даже если вы дадите Customer
методы addToCart()
и removeFromCart()
, вам все равно придется иметь некоторую логику в ShoppingCart
, чтобы эти методы действительно изменяли состояние при добавлении или удалении элемента.ИМО, актер в этом случае гораздо лучше представлен ссылкой на владельца клиента и / или наоборот, например,
$cart = new ShoppingCart;
$cart->setOwner(new Customer);
$cart->addItem(new Item('Apples'));
$cart->checkout();
Вы также можете обратиться к клиенту, например,
$customer = new Customer;
$customer->setShoppingCart(new ShoppingCart);
$customer->addItemToShoppingCart(new Item('Apples'));
$customer->checkout();
Но имя метода addItemToShoppingCart
уже подразумевает, что Customer
действует на ShoppingCart
, поэтому внутри вы, вероятно, делаете
$this->getShoppingCart()->addItem($item);
Если ShoppingCart
был составным элементом из Customer
, для которого мы хотели скрыть детали реализации, мы могли бы использовать что-то подобное, но, поскольку ShoppingCart
- это IMO, не является важной частью Customer, этот метод не должен быть для Customer.Это всего лишь вспомогательный прокси.
Вы можете создать Decorator для Customer
для управления покупательским поведением.Это будет отделять беспокойство / ответственность от How-To-Shop от Клиента, например что-то вроде
class ShoppingDecorator
{
protected $actor;
protected $cart;
protected function __construct($actor) { ... }
public function getCart() { ... };
public function addToCart() { ... }
...
}
Это такжеПозволяет вам применять Поведение покупок к другим актерам, которые могут нуждаться в таком поведении.
Подход CustomerActsOnCart
звучит примерно так же, как Шаблон посредника .Не уверен, что это выполнимый подход.