举报投诉联系我们 手机版 热门标签 鳄鱼CMS
您的位置:鳄鱼CMS > php 观察者模式 PHP 观察者模式

php 观察者模式 PHP 观察者模式

2023-05-07 00:31 PHP设计模式

php 观察者模式 PHP 观察者模式

php 观察者模式 PHP 观察者模式

php 观察者模式

目的

要实现对象的发布/订阅行为,只要[Subject]对象改变它的状态,就会通知附加的[observer]。它用于减轻对象的耦合度,并使用松耦合代替。

例子

  • 通过观察消息队列系统,可以在GUI中显示作业的进度

注意

PHP已经定义了两个接口来帮助实现这个模式:SplObserver和SplSubject。

UML 图

Alt Observer UML Diagram

代码

User.php

<?php

declare(strict_types=1);

namespace DesignPatternsBehavioralObserver;

use SplSubject;
use SplObjectStorage;
use SplObserver;


class User implements SplSubject
{
    private SplObjectStorage $observers;
    private $email;

    public function __construct()
    {
        $this->observers = new SplObjectStorage();
    }

    public function attach(SplObserver $observer): void
    {
        $this->observers->attach($observer);
    }

    public function detach(SplObserver $observer): void
    {
        $this->observers->detach($observer);
    }

    public function changeEmail(string $email): void
    {
        $this->email = $email;
        $this->notify();
    }

    public function notify(): void
    {
        
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }
}

UserObserver.php

<?php

declare(strict_types=1);

namespace DesignPatternsBehavioralObserver;

use SplObserver;
use SplSubject;

class UserObserver implements SplObserver
{
    
    private array $changedUsers = [];

    
    public function update(SplSubject $subject): void
    {
        $this->changedUsers[] = clone $subject;
    }

    
    public function getChangedUsers(): array
    {
        return $this->changedUsers;
    }
}

测试

Tests/ObserverTest.php

<?php

declare(strict_types=1);

namespace DesignPatternsBehavioralObserverTests;

use DesignPatternsBehavioralObserverUser;
use DesignPatternsBehavioralObserverUserObserver;
use PHPUnitFrameworkTestCase;

class ObserverTest extends TestCase
{
    public function testChangeInUserLeadsToUserObserverBeingNotified()
    {
        $observer = new UserObserver();

        $user = new User();
        $user->attach($observer);

        $user->changeEmail("foo@bar.com");
        $this->assertCount(1, $observer->getChangedUsers());
    }
}






阅读全文
以上是鳄鱼CMS为你收集整理的php 观察者模式 PHP 观察者模式全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 鳄鱼CMS eyucms.com 版权所有 联系我们