设计模式

设计模式 观察者模式

2020-06-15  本文已影响0人  Yohann丶blog
WechatIMG3.jpeg

介绍

shiyanlou:在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

角色

角色 说明
Subject 抽象目标类,一般至少提供三个接口:
添附(attach)
解附(detach)
通知(notify)
ConcreteSubject 具体目标,提供了观察者欲追踪的状态,也可设置目标状态
Observer 抽象观察者,定义观察者的更新操作接口
ConcreteObserver 具体观察者,实现抽象观察者的接口,做出自己的更新操作

角色示例

类名 担任角色 说明
OfficialAccount Subject 微信公众号,提供三个接口:
关注(follow)
取关(unFollow)
推送(send)
MyOfficialAccount ConcreteSubject 我的微信公众号
User Observer 用户
Developer ConcreteObserver 开发者

UML类图

观察者模式.png

代码

<?php 
abstract class User
{
    protected $username;

    function __construct($username)
    {
        $this->username = $username;
    }

    abstract function receive(OfficialAccount $officialAccount);

    abstract function getUsername();
}

abstract class OfficialAccount
{
    protected static $userList;

    function __construct()
    {
        if (!isset(self::$userList)) {
            self::$userList = [];
        }
    }

    public function follow(User $user){
        if (!in_array($user, self::$userList)) {
            self::$userList[] = $user;
            return $user->getUsername().' 关注了公众号'.PHP_EOL;
        }
    }

    public function unFollow(User $user){
        if (in_array($user, self::$userList)) {
            $key = array_search($user,self::$userList);
            unset(self::$userList[$key]);
            return $user->getUsername().' 取关了公众号'.PHP_EOL;
        }
    }

    abstract public function setArticle($article);

    abstract public function getArticle();

    public function send()
    {
        $sendLog = '';
        foreach (self::$userList as $key => $value) {
            $sendLog .= $value->receive($this);
        }
        return $sendLog;
    }
}

class MyOfficialAccount extends OfficialAccount
{
    protected $article;

    public function setArticle($article)
    {
        $this->article = $article;
    }

    public function getArticle()
    {
        return $this->article;
    }
}

class Developer extends User
{
    public function receive(OfficialAccount $officialAccount)
    {
        $article = $officialAccount->getArticle();
        return $this->username.' 接收到推送的文章:'.$article .PHP_EOL;
    }

    public function getUsername()
    {
        return $this->username;
    }
}

$myOfficialAccount = new MyOfficialAccount();

$Alan = new Developer('Alan');
$Bob = new Developer('Bob');

echo $myOfficialAccount->follow($Alan);
echo $myOfficialAccount->follow($Bob);

$myOfficialAccount->setArticle("《关于作者》");
echo $myOfficialAccount->send();

$myOfficialAccount->setArticle("《设计模式 观察者模式》");
echo $myOfficialAccount->unFollow($Bob);
echo $myOfficialAccount->send();

创建 OfficialAccounts.php,内容如上。

执行

$ php OfficialAccounts.php
Alan 关注了公众号
Bob 关注了公众号
Alan 接收到推送的文章:《关于作者》
Bob 接收到推送的文章:《关于作者》
Bob 取关了公众号
Alan 接收到推送的文章:《设计模式 观察者模式》
上一篇 下一篇

猜你喜欢

热点阅读