forked from 734380794/design-patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
11-中介者模式.php
123 lines (107 loc) · 2.65 KB
/
11-中介者模式.php
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
declare(strict_types=1);
/*
* This file is modified from `xiaohuangniu/26`.
*
* @see https://github.com/xiaohuangniu/26
*/
header('Content-type: text/html; charset=utf-8');
/**
* 抽象 中介者类.
*/
abstract class Department
{
/**
* 发送内容
* $message 内容
* $Colleague 同事实例.
* @param mixed $Message
* @param mixed $Colleague
*/
abstract public function Declared($Message, $Colleague);
}
/**
* 创建一个 - 技术部部门.
*/
class Technical extends Department
{
public $CountryChen; // 小陈
public $CountryLin; // 小林
// 发送消息
public function Declared($Message, $Colleague)
{
// 小陈的话是要传给小林的
if ($Colleague == $this->CountryChen) {
$this->CountryLin->GetMessage($Message);
} else {
$this->CountryChen->GetMessage($Message);
}
}
}
/**
* 抽象 同事类.
*/
abstract class Colleague
{
protected $Mediator;
// 中介者实例
// 获得中介者实例
public function __construct($Mediator)
{
$this->Mediator = $Mediator;
}
}
/**
* 创建一个同事 - 小陈.
*/
class Chen extends Colleague
{
public function __construct($Mediator)
{
parent::__construct($Mediator); // 调用父类构造方法
}
// 发送消息
public function Declared($Message)
{
$this->Mediator->Declared($Message, $this);
}
// 获得消息
public function GetMessage($Message)
{
echo "小陈获得对方消息:{$Message}".PHP_EOL;
}
}
/**
* 创建一个同事 - 小林.
*/
class Lin extends Colleague
{
public function __construct($Mediator)
{
parent::__construct($Mediator); // 调用父类构造方法
}
// 发送消息
public function Declared($Message)
{
$this->Mediator->Declared($Message, $this);
}
// 获得消息
public function GetMessage($Message)
{
echo "小林获得对方消息:{$Message}".PHP_EOL;
}
}
// 生成中介者实例
$Men = new Technical();
// 实例化同事 - 小陈、小林
$A = new Chen($Men);
$B = new Lin($Men);
$Men->CountryChen = $B; // 小陈要对小林说话
$Men->CountryLin = $A; // 小林要对小陈说话
$A->Declared('周经理让你过去他办公室一趟!');
$B->Declared('好的,我现在就过去。');
/*
* 说话的顺序是,小陈让小林过去经理办公室,所以逻辑是,小陈说的话被小林获得,小林说的话被小陈获得,得出以下结果:
* 小林获得对方消息:周经理让你过去他办公室一趟!
* 小陈获得对方消息:好的,我现在就过去。
*/