PHP观察者模式的简单实现

PHP5.0以上版本内置了观察者模式的实现。

观察者模式应用的场景:

1,比如新增加用户的时候,需要给用户发送邮件和短信进行通知。我们的主程序就是完成用户的增其,其他方法对进行发短信和通知。

2,具体的代码使用如下

<?php
//一个观察者模式的实现,使用php内置的方法来实现
//构建一个目标类,创建用户的时候,向用户发短息,发邮件。修改密码的时候向用户发短信
class User implements  SplSubject
{
    private $email;
    private $name;
    private $sex;
    private $observs;
        public function getEmail() {
            return $this->email;
        }
    
    
        public function getName() {
            return $this->name;
        }
    
    
        public function getSex() {
            return $this->sex;
        }
    
    
        public function setEmail($email) {
            $this->email = $email;
        }
    
    
        public function setName($name) {
            $this->name = $name;
        }
    
    
        public function setSex($sex) {
            $this->sex = $sex;
        }
    
    public function __construct($name,$email,$sex)
    {
        $this->name=$name;
        $this->email=$email;
        $this->sex=$sex;
        $this->observs=new SplObjectStorage();        
    }
    public function attach(SplObserver $observer)
     {
            $this->observs->attach($observer);
     }
    
    public function detach(SplObserver $observer) 
    {
        $this->observs->detach($observer);
    }
    
    public function notify() 
    {
            foreach($this->observs as $obs)
            {
                $obs->update($this);
            }
    }
    public function crete()
    {
        echo "新增了一个名为{$this->name}的用户<br/>";
        $this->notify();
    }
    public function resetpwd()
    {
        echo "用户{$this->name}重置了密码<br/>";
        $this->notify();
    }
}
//观察者
class sendmsg implements SplObserver
{
    public function update(SplSubject  $subject) 
    {
            echo "我要发短信了,给用户{$subject->getName()}<br/>";
    }
}
class sendemail implements SplObserver
{
    public function update(SplSubject  $subject)
    {
        echo "我给{$subject->getName()}发邮件了<br/>";
    }
}


//测试脚本
$user=new User("小花猫","小花猫@小花猫","猫猫");
$sendemail=new sendemail();
$sendmsg=new sendmsg();
$user->attach($sendemail);//注册发邮件的事件
$user->attach($sendmsg);//发留言信息


$user->crete();
echo "我要重置密码<br/> ";
$user->detach($sendmsg);
$user->resetpwd();

其中user方法实现了spl的接口splsubject,观察者实现了splObserver接口。对于spl是个什么东西,请参考http://www.php.net/spl   今天发现php.net改版了!现在一些东西在上边都很好找。

转载于:https://www.cnblogs.com/minbbp/p/3161208.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
观察者模式是一种设计模式,它允许对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在 PHP 中,可以使用 SplSubject 和 SplObserver 接口来实现观察者模式。具体实现方式可以参考以下代码: <?php // 定义主题接口 interface Subject { public function attach(Observer $observer); public function detach(Observer $observer); public function notify(); } // 定义观察者接口 interface Observer { public function update(Subject $subject); } // 实现主题类 class ConcreteSubject implements Subject { private $observers = array(); private $state; public function attach(Observer $observer) { $this->observers[] = $observer; } public function detach(Observer $observer) { $key = array_search($observer, $this->observers, true); if ($key !== false) { unset($this->observers[$key]); } } public function notify() { foreach ($this->observers as $observer) { $observer->update($this); } } public function setState($state) { $this->state = $state; $this->notify(); } public function getState() { return $this->state; } } // 实现观察者类 class ConcreteObserver implements Observer { private $name; public function __construct($name) { $this->name = $name; } public function update(Subject $subject) { echo "Observer {$this->name} has been notified with state {$subject->getState()}\n"; } } // 使用示例 $subject = new ConcreteSubject(); $observer1 = new ConcreteObserver('Observer 1'); $observer2 = new ConcreteObserver('Observer 2'); $observer3 = new ConcreteObserver('Observer 3'); $subject->attach($observer1); $subject->attach($observer2); $subject->attach($observer3); $subject->setState('state 1'); $subject->setState('state 2'); $subject->detach($observer2); $subject->setState('state 3'); ?> 以上代码实现了一个简单观察者模式,主题类 ConcreteSubject 维护了一个观察者列表,当主题状态发生改变时,会通知所有观察者进行更新。观察者类 ConcreteObserver 实现了更新方法,当被通知时,会输出当前主题状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值