php設計模式 - 觀察者模式

場景:要寫一個訂單系統,買了東西后要給用戶發送email,改變訂單狀態,等等。php

一般是這麼寫的:設計模式

class Order{

 public function buy(){
     echo 'buy!';
     $email = new Email();
     $email -> doing();
     $os = new orderStatus();
     $os -> doing();
 }
 
}

class Email{
    public function doing(){
        echo "send Email!!";
    }
}

class orderStatus{
    public function doing(){
        echo "order finish!!";
    }
} 

$order = new Order();
$order -> buy();

這樣就完成了?學了設計模式原則之後,怎麼感受壞極了。擴展性太差。order和email,orderstatus間的耦合過高了,類的複用性太差。(違反了開閉原則和迪米特法則)this

class Order{
    protected $observers = array();
    
    public function addObserve($type, $observer){
        $this -> observers[$type][] = $observer;
    }
    
    public function observer( $type ){
        if(isset($this -> observers[$type])){
            foreach($this -> observers[$type] as $observer){
                $observer -> doing( $this );
            }
        }
    }
    
    public function buy(){
        echo "buy!!!";
        $this -> observer('buy');
    }

}

interface IDo{
    public function doing();
}
class Email implements IDo{
    public function doing(){
        echo "send Email!!";
    }
}

class orderStatus implements IDo{

    public function doing(){
        echo "order finish!!";
    }
}

$order = new Order();

$order -> addObserve('buy', new Email() );
$order -> addObserve('buy', new orderStatus () );

$order -> buy();

觀察者模式:可以更便利建立和處理與核心對象相關對象的動做,而且提供和核心對象(order)非耦合的系列功能。spa

觀察者模式很是實用,在這種場景下的應用可以最大程度的下降類之間的耦合度,提升類的複用性。
設計

相關文章
相關標籤/搜索