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

设计模式 观察者模式

作者: Yohann丶blog | 来源:发表于2020-06-15 17:49 被阅读0次
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 接收到推送的文章:《设计模式 观察者模式》

相关文章

  • 观察者设计模式

    每周学点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/yaehxktx.html