PHP设计模式之观察者模式

模式中的角色:

1.  抽象观察者

2. 具体观察者

3. 抽象主题

4. 具体主题


场景:

假设一个商城系统里面,用户下单付款完成,则财务(Cashier)需要出发票,出纳(Accountant)需要记账,配送员(Dilliveryman)需要配货


UML - 类图

Main.png

第一. 抽象观察者

file: ObserverClass.php

<?php
 /**
  * Observer Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */

namespace Observer;
interface ObserverClass{
	public function doSomething();
}

第二. 具体观察者(Cashier

file : CashierClass.php

<?php
 /**
  * Observer Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */

namespace Observer;
class CashierClass implements ObserverClass{
	public function doSomething(){
		echo 'CashierClass do something.<br>';
	}
}

第三. 具体观察者(Accountant

file : AccountantClass.php

<?php
 /**
  * Observer Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */

namespace Observer;
class AccountantClass implements ObserverClass{
	public function doSomething(){
		echo 'AccountantClass do something.<br>';
	}
}

第四. 具体观察者(Dilliveryman

file : DilliverymanClass.php

<?php
 /**
  * Observer Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */

namespace Observer;
class DilliverymanClass implements ObserverClass{
	public function doSomething(){
		echo 'DilliverymanClass do something.<br>';
	}
}


第五. 抽象主题

file: AbstractSbujectClass.php

<?php
 /**
  * Observer Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */

namespace Subject;
interface AbstractSbujectClass{

	public function add($observer);

	public function delete($observer);

	public function notify();
}


第六. 具体主题

file: ConcreteSbujectClass.php

<?php
 /**
  * Observer Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */

namespace Subject;
class ConcreteSbujectClass implements AbstractSbujectClass{

  private $observer = array();


	public function add($observer){
    $this->observer[] = $observer;
  }


	public function delete($observer){
    $index = array_search($observer, $this->observer);
    if($index === false){
      return true;
    }
    unset($this->observer[$index]);
    return true;
  }


	public function notify(){
    foreach($this->observer as $observer){
      if(method_exists($observer, 'doSomething')){
        $observer->doSomething();
      }
    }
  }
}


第七. 测试代码

<?php
 /**
  * Observer Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */

require_once('./Autoload.class.php');

$subject = new \Subject\ConcreteSbujectClass();
$Accountant = new \Observer\AccountantClass();
$Cashier = new \Observer\CashierClass();
$Dilliveryman = new \Observer\DilliverymanClass();

$subject->add($Accountant);
$subject->add($Cashier);
$subject->add($Dilliveryman);
$subject->notify();

echo '<br>----------remove Cashier from Observer--------------<br>';
$subject->delete($Cashier);
$subject->notify();


第八

下载源码