我在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');
}
我並未之前提及但OrderItem的表示下列MySQL錶行 列包括 positionID:參考位置正在編輯 數量 qtypicked 用戶 當其構造的對象它抓住MySQL的行數據和存在作爲(用於驗證和記錄特定的方法) 我將如何添加從類外的位置刪除依賴性,但仍然保持鏈接的業務邏輯? – user966936
ha ..或者我可以將對象的創建與注入所需對象的工廠類分離。 – user966936
或者,如果適合,可以在EDIT中使用該方法。 – Vikk