设计模式 观察者模式

WechatIMG3.jpeg

介绍

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

角色

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

角色示例

类名 担任角色 说明
OfficialAccount 抽象目标 微信公众号,提供三个接口:
关注(follow)
取关(unFollow)
推送(send)
MyOfficialAccount 具体目标 我的微信公众号
User 抽象观察者 用户
Developer 具体观察者 开发者

UML类图

观察者模式.png

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?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,内容如上。

执行

1
2
3
4
5
6
7
$ php OfficialAccounts.php
Alan 关注了公众号
Bob 关注了公众号
Alan 接收到推送的文章:《关于作者》
Bob 接收到推送的文章:《关于作者》
Bob 取关了公众号
Alan 接收到推送的文章:《设计模式 观察者模式》
-------------本文结束感谢您的阅读-------------
0%