美文网首页php
设计模式--观察者模式

设计模式--观察者模式

作者: ysp123 | 来源:发表于2019-03-20 13:42 被阅读0次

观察者模式,当一个对象的状态发生改变时,依赖它的对象会全部收到通知,并自动更新。
场景:一个事件发生后,触发一系列的更新操作,实现低耦合,非入侵式的通知和更新。
了解基本概念,上代码:

//观察者模式,事件绑定
class PluginA implements SplObserver{
    function update(\SplSubject $subject){
        if($subject->event == 'register'){
            echo "plugin A observer register".PHP_EOL;
        }
    }
}

class PluginB implements SplObserver{
    function update(\SplSubject $subject){
        if($subject->event == 'register'){
            echo "plugin A observer register".PHP_EOL;
        }
        if($subject->event == 'login'){
            echo "plugin A observer login".PHP_EOL;
        }
    }
}


class Observer implements SplObserver{

    public $config = [];

    public function __construct($config){
        foreach($config as $plugin => $events){
            foreach($events as $event){
                $this->config[$event][] = $plugin;
            }
        }
    }

    public function update(\SplSubject $subject){
        if(array_key_exists($subject->event, $this->config)){
            foreach($this->config[$subject->event] as $plugin){
                $object = new $plugin();
                $object->update($subject);
            }
        }
    }

}


class User implements SplSubject{
    public $event; 
    private $observers = [];
    public $user = [];
    public $observer;

    public function register(){
        $this->event = 'register';
        $this->notify();
    }

    public function login(){
        $this->event = 'login';
        $this->notify();
    }

    public function attach(\SplObserver $observer){
        $this->observer = $observer;
    }

    public function detach(\SplObserver $observer){
        $this->observer = null;
    }

    public function notify(){
        $this->observer->update($this);
    }
}

$user = new User();

$config = [
    'PluginA' => ['register'],
    'PluginB' => ['register','login'],
];

$observer = new Observer($config);
$user->attach($observer);

$user->register();
$user->login();

观察者模式,订单支付场景应用:

interface ITicketObserver{   //观察者接口
    function BuyTicketOver($sender, $args); 
}

interface ITicketSubject{
    function addObserver($observer);
}


class BuyMSM implements ITicketObserver{
    function BuyTicketOver($sender, $ticket){
        echo(date( 'Y-m-d H:i:s' ) . " 短信日志记录:购票成功:$ticket<br>".PHP_EOL);
    }
}

class BuyEmail implements ITicketObserver{
    function BuyTicketOver($sender, $ticket){
        echo(date( 'Y-m-d H:i:s' ) . " 邮件通知记录:购票成功:$ticket<br>".PHP_EOL);
    }
}

class BuyPrivilege implements ITicketObserver{
    function BuyTicketOver($sender, $ticket){
        echo(date( 'Y-m-d H:i:s' ) . " 优惠券使用记录:购票成功:$ticket<br>".PHP_EOL);
    }
}



/***
 * 主题
 */
class subject implements ITicketSubject{
    public $observer = [];

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

    public function notify(){
        foreach($this->observer as $key => $obser){
            $obser->BuyTicketOver('123','观影');
        }
    }
}

$subject = new subject();

$subject->addObserver(new BuyMSM());
$subject->addObserver(new BuyEmail());
$subject->addObserver(new BuyPrivilege());
$subject->notify();

相关文章

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 设计模式02-观察者者设计模式

    [toc] 设计模式02-观察者者设计模式 主要来源Head First设计模式(书)观察者设计模式是JDK中使用...

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava设计模式与原理

    标准观察者设计模式 RxJava是一种特殊的观察者模式,首先我们先来看标准的观察者设计模式。在标准观察者模式中,存...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • Guava源码分析——EventBus

    EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。 1、程序示例...

  • 设计模式之观察者模式

    设计模式之观察者模式 本篇是设计模式系列博客的第四篇,本篇主要学习设计模式中的第二个行为型模式---观察者模式。 ...

  • PHP设计模式之观察者模式

    PHP设计模式之观察者模式

  • Android中涉及的模式

    我的Java设计模式-建造者模式 我的Java设计模式-观察者模式 重学设计模式之单例模式

网友评论

    本文标题:设计模式--观察者模式

    本文链接:https://www.haomeiwen.com/subject/iblzmqtx.html