zoukankan      html  css  js  c++  java
  • php设计模式-观察者模式

    简言之:观察者模式(Observer),当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新。

    具体描述:一个对象通过添加一个方法(该方法允许另一个对象-观察者,注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。观察者模式是一种时间系统,意味着这一模式允许某个类观察另一个类的状态。当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作,观察者模式避免组件之间的紧密耦合。

    观察者模式中的角色

    • Subject(抽象主题角色):主题角色将所有观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者。抽向主题提供了增加和删除观察者对象的接口。
    • Observer(抽象观察者角色):为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己。
    • ConcreteSubject(具体主题角色):存储相关状态到具体观察者对象,当具体主题的内部状态改变时,给所有登记过的观察者发出通知,具体主题角色通常用一个具体子类实现。
    • ConcreteObserver(具体观察者角色):存储一个具体主题对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致。
    推荐阅读代码:

    简单代码实现

    • LibsEventGenerator.php
    <?php
    namespace Libs;
    
    abstract class EventGenerator
    {
        private  $observers=array();
        public function addObserver(Observer $observer)
        {
            echo "添加了-";
            $this->observers[] = $observer;
        }
        public function notify()
        { 
            foreach ($this->observers as $observer)
            {
                echo "发生了-";
                $observer->update();
            }
        }
    }
    • LibsObserver.php
    <?php
    namespace Libs;
    
    interface Observer
    {
        public function update($event_info=null);
    }
    • LibsObserverOne.php
    <?php
    namespace Libs;
    
    class ObserverOne implements Observer
    {
        public function update($event_info=null)
        {
            echo "One!";
        }
    }
    • LibsEvent
    <?php
    namespace Libs;
    
    class Event extends LibsEventGenerator
    {
        public function trigger()
        {
            echo "执行了-";
            $this->notify();
        }
    }
    • 调用
    $event = new LibsEvent();
    $event->addObserver(new LibsObserverOne);
    $event->trigger();
    • 结果:

    添加了-执行了-发生了-One!

    推荐阅读:

    php模式设计之观察者模式

    PHP设计模式之观察者模式

    PHP 设计模式之观察者模式

  • 相关阅读:
    Entity Framework 6 (7) vs NHibernate 4: DDD perspective(纯净DDD很难很难...)
    asp.net解决高并发的方案
    我所经历的SAP选型[转]
    为什么我不再用 .NET 框架
    Why I Left the .NET Framework
    Docker 传奇之 dotCloud
    ICE概述
    .NET Out Of Memory Exception
    iOS-申请邓白氏编码的超详细流程介绍
    .NET对象与Windows句柄(三):句柄泄露实例分析
  • 原文地址:https://www.cnblogs.com/ddddemo/p/5623343.html
Copyright © 2011-2022 走看看