Même si vous donnez un Customer
les méthodes addToCart()
et removeFromCart()
, vous devez toujours avoir une certaine logique dans ShoppingCart
d'avoir ces méthodes font réellement le changement d'état lorsqu'un élément est ajouté ou supprimé. OMI, l'acteur dans ce cas est beaucoup mieux représenté par une référence au client propriétaire et/ou viceversa, par exemple.
$cart = new ShoppingCart;
$cart->setOwner(new Customer);
$cart->addItem(new Item('Apples'));
$cart->checkout();
Vous pouvez également vous en servir auprès du client, par ex.
$customer = new Customer;
$customer->setShoppingCart(new ShoppingCart);
$customer->addItemToShoppingCart(new Item('Apples'));
$customer->checkout();
Mais le nom de la méthode addItemToShoppingCart
implique déjà que les Customer
agit sur un ShoppingCart
, donc à l'intérieur vous font probablement
$this->getShoppingCart()->addItem($item);
Si ShoppingCart
était un composite element de Customer
pour laquelle nous voulions cacher les détails de mise en œuvre , nous pourrions utiliser quelque chose comme ça, mais puisque le ShoppingCart
est OMI pas une partie essentielle d'un client cette méthode ne devrait pas être sur le client. Ce n'est rien d'autre qu'un proxy de commodité.
Vous pouvez créer un Decorator pour le Customer
pour gérer le comportement de magasinage. Cela désaccouple le concern/responsibility de Comment-Pour-Boutique auprès du Client, par ex. Quelque chose comme
class ShoppingDecorator
{
protected $actor;
protected $cart;
protected function __construct($actor) { ... }
public function getCart() { ... };
public function addToCart() { ... }
...
}
Ceci vous permettrait également d'appliquer le Comportement Shopping à d'autres acteurs qui pourraient avoir besoin de ce comportement. L'approche CustomerActsOnCart
ressemble un peu à la Mediator Pattern. Je ne sais pas si c'est une approche réalisable.
J'aime les deux premières illustrations de la façon dont on peut y penser en utilisant un chariot ou un client agissant sur un chariot. Aide vraiment à éclaircir les choses. –
pense en fait que le médiateur est parfait dans ce cas ... –