设计模式 中介者模式

WechatIMG44.jpeg

介绍

中介者模式是一种行为型设计模式,它通过一个中介者对象来封装一系列对象之间的交互,从而使它们之间的耦合度降低,变得更加灵活。

角色

角色 说明
Mediator 抽象中介者
ConcreteMediator 具体中介者
Colleague 抽象同事类
ConcreteColleague 具体同事类

角色示例

类名 担任角色 说明
Express 抽象中介者 快递
SFExpress 具体中介者 顺丰快递
User 抽象同事类 用户
Sender 具体同事类 寄件人
Receiver 具体同事类 收件人

UML类图

Screen Shot 2020-06-12 at 6.04.25 PM.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
<?php 
abstract class User
{
protected $name;
protected $express;

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

abstract public function sendExpress($receiver,$package);
abstract public function receiveExpress($sender,$package);

public function checkExpress(){
if(!$this->express) exit("未设置快递公司");
}

public function setExpress($express){
$this->express = $express;
}
}

class Sender extends User
{
public function sendExpress($receiver,$package)
{
$this->checkExpress();
$this->express->ship($receiver,$package);
return "我是".$this->name.",寄".$package."给".$receiver->name.PHP_EOL;
}

public function receiveExpress($sender,$package)
{
return "我是".$this->name.",收到".$sender->name."的".$package.PHP_EOL;
}
}

class Receiver extends User
{
public function sendExpress($receiver,$package)
{
$this->checkExpress();
$this->express->ship($receiver,$package);
return "我是".$this->name.",寄".$package."给".$receiver->name.PHP_EOL;
}

public function receiveExpress($sender,$package)
{
return "我是".$this->name.",收到".$sender->name."的".$package.PHP_EOL;
}
}

abstract class Express
{
abstract public function ship($user,$package);
abstract public function fillForm($user);
}

class SFExpress extends Express
{
protected static $nameList;
function __construct()
{
if (!isset(self::$nameList)) {
self::$nameList = [];
}
}

public function ship($user,$package)
{
if(count(self::$nameList) < 2) {
exit("请核对快递单中的寄件或收件人是否填写");
}
return $user->receiveExpress($user, $package);
}

public function fillForm($user)
{
if (!in_array($user, self::$nameList)) {
self::$nameList[get_class($user)] = $user;
}
$user->setExpress($this);
}
}

$sender = new Sender("小哀");
$receiver = new Receiver("柯南");

$sfEpress = new SFExpress();
$sfEpress->fillForm($sender);
$sfEpress->fillForm($receiver);

echo $sender->sendExpress($receiver, "APTX-4869的解药");
echo $receiver->sendExpress($sender, "感谢信");

创建 Test.php,内容如上。

执行

1
2
3
$ php Test.php
我是小哀,寄APTX-4869的解药给柯南
我是柯南,寄感谢信给小哀
-------------本文结束感谢您的阅读-------------
0%