PHP设计模式——观察者模式

声明:本系列博客參考资料《大话设计模式》,作者程杰。


        观察者模式(有时又被称为公布-订阅模式)。

在此种模式中,一个目标物件管理全部相依于它的观察者物件。而且在它本身的状态改变时主动发出通知。

这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。


            UML类图:

      


       重要角色:

       抽象通知者角色(INotifier):定义了通知的接口规则。

       详细通知者角色(Boss):实现抽象通知者的接口,接到状态改变马上向观察者下发通知

       抽象观察者角色(IObserver):定义接到通知后所做的操作(Update)接口规则。

       详细观察者角色(JingDong):实现详细操作方法。


       核心代码:

      

//抽象通知者
abstract class Subject
{
    private $observers = array();

    public function  Attach(Observer $observer)
    {
        array_push($this->observers,$observer);
    }

    public function  Detach(Observer $observer)
    {
        foreach($this->observers as $k=>$v)
        {
            if($v==$observer)
            {
                unset($this->observers[$k]);
            }
        }
    }

    function  Notify()
    {
        foreach($this->observers as $v)
        {
            $v->Update();
        }
    }
}

//详细通知者(Boss和Secretary)
class ConcreteSubject extends Subject
{
   public $subject_state;
}

//抽象观察者
abstract class Observer
{
    public abstract function Update();
}

//详细观察者
class ConcreteObserver extends Observer
{
    private $name;
    private $observerState;
    public $subject;

    public function __construct(ConcreteSubject $_sub,$_name)
    {
        $this->subject = $_sub;
        $this->name = $_name;
    }

    public function  Update()
    {
        $this->observerState = $this->subject->subject_state;
        echo "观察者".$this->name."的新状态是:".$this->observerState."<br/>";
    }
}


            调用client代码:

           

header("Content-Type:text/html;charset=utf-8");
//-------------------------观察者模式-----------------------
require_once "./Observe/Observe.php";
//前台
$_s = new ConcreteSubject();

//宝银
$baoyin = new ConcreteObserver($_s, "张三");
$jiangchao = new ConcreteObserver($_s,"李四");

//前台记下宝银姜超
$_s->Attach($baoyin);
$_s->Attach($jiangchao);

//前台发现老板回来
$_s->subject_state = "孙总回来了";

//前台发送通知
$_s->Notify();


         长处:

1、一个抽象模型有两个方面,当中一个方面依赖于还有一个方面。

将这些方面封装在独立的对象中使它们能够各自独立地改变和复用。

2一个对象的改变将导致其它一个或多个对象也发生改变。而不知道详细有多少对象将发生改变,能够减少对象之间的耦合度。

3、一个对象必须通知其它对象,而并不知道这些对象是谁。须要在系统中创建一个触发链。A对象的行为将影响B对象。B对象的行为将影响C对象……。能够使用观察者模式创建一种链式触发机制。


欢迎关注我的视频课程,地址例如以下,谢谢。


   PHP面向对象设计模式

原文地址:https://www.cnblogs.com/lytwajue/p/7016535.html