php

设计模式--观察者模式

2019-03-20  本文已影响0人  ysp123

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

//观察者模式,事件绑定
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();
上一篇 下一篇

猜你喜欢

热点阅读