介绍
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 接收到推送的文章:《设计模式 观察者模式》
网友评论