php oop actor对对象采取行动

时间:2010-08-24 11:30:12

标签: php oop architecture

考虑建筑......

我通常有一个带有addItem和removeItem方法的购物车类(在其他几个方面)。然而,在现实世界的精神下,shananigans推车应该由客户采取行动 - 因此addtoCart / removefromCart应该不是客户的方法吗?

或者我应该有一个itermediate CustomerActsOnCart对象,它将customer和cart对象作为构造函数中的参数并在那里执行操作???

任何沉思都会受到欢迎......

2 个答案:

答案 0 :(得分:1)

我看到的方式...... Customer类和Cart类之间的关系是1x1,所以你可以在Cart中放置Customer对象的引用..或者将Cart对象放在Customer中,我会说最好使用第二个选项,因为它更容易获得当前用户,然后你可以做类似的事情:

$current_user->getCart()->addtoCart()

并将addtoCart / removeItem方法保留在Cart对象中

希望有所帮助

答案 1 :(得分:1)

即使您提供Customer方法addToCart()removeFromCart(),您仍然必须在ShoppingCart中使用某些逻辑才能让这些方法实际执行状态更改添加或删除项目时IMO,在这种情况下,参与者可以更好地代表拥有的客户和/或反之亦然,例如

$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);

如果ShoppingCartCustomer ShoppingCart我们想要隐藏实现细节,我们可以使用类似的东西,但由于Customer是IMO而不是客户必不可少的一部分客户。它只不过是一个便利代理。

您可以为class ShoppingDecorator { protected $actor; protected $cart; protected function __construct($actor) { ... } public function getCart() { ... }; public function addToCart() { ... } ... } 创建composite element来处理购物行为。这会将 How-To-Shop Decorator / concern与客户分离,例如

之类的东西
CustomerActsOnCart

这也允许您将购物行为应用于可能需要此行为的其他actor。

{{1}}方法听起来有点像responsibility。不确定这是否是一种可行的方法。