观察者设计模式问题

时间:2011-09-27 11:54:23

标签: php design-patterns architecture observer-pattern

我在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');
    }

2 个答案:

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

这样您就可以解除OrderItemPickObserverPosition类的分离。

编辑:

如果您的业务逻辑不允许您在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)); 
相关问题