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/>";
    }
}

            调用客户端代码:

           

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面向对象设计模式

时间: 2024-09-20 14:40:08

PHP设计模式——观察者模式的相关文章

设计模式:观察者模式(observer)

设计模式:观察者模式(observer) 这种设计模式大量的使用,简单的说就是观察者通过被观察者来获得外界某种事物的状态 Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步. 如下图: image.png 被观察者(concreteSubject):其中必然包含了一个观察者的列表,用于状态发生变化的时候通过链表进行通知每个观察者做出相应的变化 观察者(ConcreteObserver):其中必然包含各种应对外界状态变化的方法,以供被观察者调用 图中

Javascript设计模式:观察者模式

一直以来都想把在实际开发中的一些经验系统地整理一下,共享出来给一些有志于深入B/S开发的朋 友,趁着国庆忙里偷闲,先试验性的写一下有关于Javascript开发中的比较有用的东西. 设计模 式一直以来都是在面向对象的语言,或比较正规化的开发中才会出现的一门程序设计思想.一直以来众 多的前端开发者认为使用OO方式来写JS更像是一个程序开发者,殊不知一旦将这门脚本语言深入进去后 ,仅仅才是一个开始,设计模式仅能算是对程序设计深入了解的第一步. 为什么要用设计模式我 就不多说了,仁者见仁的问题,现在还

hand first设计模式 --观察者模式

利用java api 实行观察者模式 1.推模式(主题将一样数据发生给所有的观察者) 主题 Java代码 public class WeacherData extends Observable { private int data1; private int data2; public void update(){ this.setChanged(); //这里将WeacherData 对象传递给观察者属于推模式 this.notifyObservers(this); } public int

设计模式--观察者模式(C++)

作者:刘勉刚 E-mail:liumgj@163.com 观察者模式是应用非常广泛的设计模式之一,前面已经用C#实现了,下面是C++的实现,在C++实现中,C++中没有接口的概念,但是可以用抽象类类代替Java或C#中的接口,在C++中抽象类中从派生类中抽象出来的函数(方法),必须定义成纯虚函数,这样在后面的使用中才可以通过基类的指针来访问这些函数,面向对象的语言中有个特点,多态只能访问两者中共有的部分. #include #include #include using namespace st

IOS设计模式-观察者模式

前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observing),本篇博文将会先讲解通知和KVO的常用方法和使用示例,然后讲解观察者模式以及对观察者模式的实现.   文章内容大纲: 1.KVO的使用 2.通知的使用 3.观察者模式   正文: 1.KVO的使用 addObserver:forKeyPath:options:context: 通知其他对象的方

[Head First设计模式]山西面馆中的设计模式——观察者模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在我身边. 为什么观察者模式会出现呢? 为了建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统

.NET设计模式-观察者模式(Observer Pattern)

概述 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>] 结构图 图1 Observer模式

设计模式-观察者模式

观察者模式分析 观察者模式又叫做发布-订阅(Publish/Subscribe)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 特点: 观察者模式的通知者可以有任意数目的依赖它的Observer,一旦通知者的状态改变,所有的Observer都可以得到通知.通知者发出通知时并不需要知道谁是它的观察者,也就是说,具体观察者是谁,它根本不需要知道. 总得来讲,观察者模式所做的工作其实就是

19、Python与设计模式--观察者模式

一.火警报警器(2) 在门面模式中,我们提到过火警报警器.在当时,我们关注的是通过封装减少代码重复.而今天,我们将从业务流程的实现角度,来再次实现该火警报警器. class AlarmSensor: def run(self): print "Alarm Ring..." class WaterSprinker: def run(self): print "Spray Water..." class EmergencyDialer: def run(self): p