我在php中创建一个oop系统,并希望在其中实现更多的观察者模式,因为我希望减少我的类之间的重叠耦合。
我的问题是这个。 关于这种模式的设计的最佳实践,一个类可以将观察者添加到该类正在使用的另一个类。 或者我应该让观察者加入链中的最顶级?
示例:(假设其他方法被调用但未包含在类中,但对于此示例而言并不重要。)
class orderItem extends observable {
public function pick($qty, $user){
$this->setUser($user);
$position = new position($this->getPositionID());
$position->addObserver(new ProductObserver()); // is this the best option ? ?
$position->setQty($position->getQty() - $qty);
$position->save();
$this->notify(self::EVENT_PICK); // notify observers
}
}
class orderProductObserver implements observer {
public function update($orderitem){
$position = new position($orderitem->getPositionID());
$product = new product($position->getProductID());
if($product->getQty() < $product->getMinimum()) {
$alert = new minProductAlert($product);
}
}
}
class ProductObserver implements observer {
public function update($position){
$product = new product($position->getProductID());
if($product->getQty() < $product->getMinimum()) {
$alert = new minProductAlert($product);
}
}
}
$order = new orderItem(123);
$order->addObserver(new orderProductObserver()); // or is this the best option ??
$order->pick(2, 'bill');
或者如果两种方法都错了,我对你的输入很感兴趣。
通过删除orderitem和position之间的依赖关系,这个例子是最理想的吗?
class OrderItem extends Observable {
public function pick($qty, $user){
$this->setUser($user);
$this->setPickedQty($qty);
$this->save();
$this->notify(self::EVENT_PICK); // notify observers
}
}
class OrderItemPickObserver implements Observer {
public function update($orderitem){
$position = new Position($orderitem->getPositionID());
$position->addObserver(new ProductPositionObserver());
$position->setQty($position->getQty() - $orderItem->getPickedQty());
$position->save();
}
}
class ProductPositionObserver implements Observer {
public function update($position){
$product = new product($position->getProductID());
if($product->getQty() < $product->getMinimum()) {
$alert = new minProductAlert($product);
}
}
}
$pickQty = 2;
$orderitem = new OrderItem(123);
$position = new Position($orderitem->getPositionID());
if($position->getQty() >= $pickQty)
{
$orderitem->addObserver(new OrderItemPickObserver()); // or is this the best option ??
$orderitem->pick($pickQty, 'bill');
}
答案 0 :(得分:0)
我会使用你的第二种方法......比第一种方法(依赖注入)更清楚地阅读和理解 - 这里给出了很好的例子(虽然是旧文件) - &gt; http://www.ibm.com/developerworks/library/os-php-designptrns/
答案 1 :(得分:0)
第二个示例看起来不错,但我不确定是否在Position
类的更新方法中创建了新的OrderItemPickObserver
对象。相反,我建议将Position
对象保留为OrderItem
类的属性,以便您可以从外部设置它。
class OrderItem extends Observable {
private $_position;
public function setPosition($position){
$this->_position = $position;
}
public function getPosition(){
return $this->_position;
}
}
然后更新OrderItemPickObserver
类:
class OrderItemPickObserver implements Observer {
public function update($orderitem){
$position = $orderitem->getPosition());
$position->setQty($position->getQty() - $orderItem->getPickedQty());
$position->save();
}
}
你的主叫代码:
$orderitem = new OrderItem(123);
$position = new Position();
$position->addObserver(new ProductPositionObserver());
$orderitem->setPosition($position);
这样您就可以解除OrderItemPickObserver
和Position
类的分离。
编辑:
如果您的业务逻辑不允许您在Position
类中拥有OrderItem
对象,则可以将其移至OrderItemPickObserver
,因为这是实际使用Position
的类。 {1}}对象。
class OrderItemPickObserver implements Observer {
private $_position;
function __construct($position){
$this->_position = $position;
}
public function update($orderitem){
$position = $this->_position;
$position->setId($orderitem->getPositionID());
$position->setQty($position->getQty() - $orderItem->getPickedQty());
$position->save();
}
}
你的主叫代码:
$orderitem = new OrderItem(123);
$position = new Position();
$position->addObserver(new ProductPositionObserver());
...
...
$orderitem->addObserver(new OrderItemPickObserver($position));