forked from 734380794/design-patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
09-命令模式.php
145 lines (124 loc) · 2.65 KB
/
09-命令模式.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?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');
/**
* 接口 命令类.
*/
interface Initiator
{
public function Command(); // 抽象出一个普通命令接口
}
/**
* 写张圣旨 - 皇上要打鬼子了.
*/
class DaZhang implements Initiator
{
public function Command()
{
echo '快去给我削了那帮鬼子!'.PHP_EOL;
}
}
/**
* 写张圣旨 - 皇上要吃饭.
*/
class ChiFan implements Initiator
{
public function Command()
{
echo '给朕准备两桌好菜!'.PHP_EOL;
}
}
/**
* 抽象 部门类.
*/
abstract class Command
{
public $name; // 部门名称
protected $Initiator; // 命令的实例
// 抽象一个方法,所有部门都必须实现,用于执行命名
public function execute()
{
}
}
/**
* 创建 - 兵部.
*/
class BingBu extends Command
{
public function __construct($Initiator)
{
$this->name = '兵部';
$this->Initiator = $Initiator; // 接圣旨
}
public function execute()
{
$this->Initiator->Command();
}
}
/**
* 创建 - 御膳房
*/
class ChuFang extends Command
{
public function __construct($Initiator)
{
$this->name = '御膳房';
$this->Initiator = $Initiator; // 接圣旨
}
public function execute()
{
$this->Initiator->Command();
}
}
/**
* 抽象 对接类.
*/
abstract class Pickup
{
public $name; // 对接人名称
protected $Initiator; // 部门的实例,你得告诉对接人要去哪里,并且对接人不该拥有任何操作命令的权限,防止中途被修改
// 抽象一个方法,对接人需要使用这个方法去发送命令
public function run_errands()
{
}
}
/**
* 创建一个对接人 - 太监小李子.
*/
class TaiJian extends Pickup
{
public function __construct($Command)
{
$this->name = '东厂- 小李子';
$this->Command = $Command; // 接到部门地址
}
// 去传递命令咯
public function run_errands()
{
echo $this->name.',奉天承运:';
$this->Command->execute();
echo $this->Command->name.',领旨!'.PHP_EOL;
}
}
/**
* 创建一个发起人 - 皇上.
*/
class HuangShang
{
public function Go()
{
// 让小李子去兵部
$tj1 = new Taijian(new BingBu(new DaZhang()));
$tj1->run_errands();
// 让小李子去御膳房
$tj2 = new Taijian(new Chufang(new ChiFan()));
$tj2->run_errands();
}
}
$res = new HuangShang();
$res->Go();