zoukankan      html  css  js  c++  java
  • 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面向对象设计模式

  • 相关阅读:
    应届毕业生简历撰写技巧
    【LeetCode】- Longest Substring Without Repeating Characters
    线性规划
    什么是凸规划
    最优化算法 (一)
    香农定理和频谱效率
    虚函数的用法
    QT学习一
    努力!
    Qslider
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7016535.html
Copyright © 2011-2022 走看看