2010-08-24 51 views
1

考虑架构....PHP OOP演员作用于对象

我通常有的addItem和removeItem方法的购物车类(除其他几个)。然而,在现实世界中,shananigans的推车应该由顾客采取行动 - 因此,addtoCart/removefromCart不应该成为顾客的一种方法吗?

或者我应该有一个中间CustomerActsOnCart对象,它将客户和购物车对象作为构造函数中的参数并在那里执行操作?

任何思索将是最受欢迎的...

回答

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

如果ShoppingCart是的Customer一个composite element为此我们想隐藏实现细节,我们可以使用类似的东西,但由于ShoppingCart是IMO不是客户的重要组成部分,所以这种方法不应该在Customer上。这只不过是一个便利的代理。

您可以为Customer创建Decorator以处理购物行为。这将解耦来自客户的如何购物的concern/responsibility,,例如,像

class ShoppingDecorator 
{ 
    protected $actor; 
    protected $cart; 
    protected function __construct($actor) { ... } 
    public function getCart() { ... }; 
    public function addToCart() { ... } 
    ... 
} 

这也可以让你将购物行为应用到可能需要这种行为的其他行动者。

CustomerActsOnCart方法听起来有点像Mediator Pattern。不知道这是否是一种可行的方法。

+1

我喜欢前两个插图,说明如何使用推车或顾客在购物车上进行操作来考虑此问题。真的有助于清理事情。 – 2010-08-24 12:15:45

+0

实际上认为调解员在这种情况下是完美的... – 2010-08-24 12:43:06

1

我看到它的方式......一个Customer类和Cart类相互之间一个1x1的关系,所以你可以把客户对象的引用在购物车..或将一个Cart对象放在Customer中,我会说使用第二个选项更好,因为它可以更容易地获得当前用户,然后您可以执行类似操作:

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

并保持Cart对象内的addtoCart/removeItem方法

希望它有助于

+0

我认为1:1关系是关键。在现实生活中的超市中,许多顾客使用单一的购物车,尽管是连续的。在像亚马逊这样的虚拟商店中,ShoppingCart是单个客户的属性。但是,客户有许多不同的活动,所以将购物车相关的方法放在购物车上更清洁。 – APC 2010-08-24 11:52:59

+0

1:1关系看起来过于严格。 ----如果多人想共享购物车会怎么样? (家庭购物为某人的生日礼物)。或者如果一个顾客想要多个购物车(商业购物和个人购物同时完成不同的信用卡)呢? – 2010-08-24 11:54:33

+0

1对1的关系不是给定的。根据您的需求,您可能需要一个客户才能访问多个购物车,或者确实有很多客户访问一个购物车。移动演员的添加/删除是我认为最真实的建模现实世界的方式。只是MO ofcourse;) – 2010-08-24 11:57:27