命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。
以下代码显示了此模式的一个示例。
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
|
<?php
//定义命令接口
interface
ICommand {
function
onCommand(
$name
,
$args
);
}
//定义维护命令对象列表的类
class
CommandChain {
//定义对象列表数组
private
$_commands
=
array
();
//定义添加命令方法
public
function
addCommand(
$cmd
){
$this
->_commands[] =
$cmd
;
}
//定义执行命令的方法
public
function
runCommand(
$name
,
$args
){
foreach
(
$this
->_commands
as
$cmd
) {
if
(
$cmd
->onCommand(
$name
,
$args
)){
return
;
}
}
}
}
//定义一个添加用户的命令对象
class
UserCommand
implements
ICommand {
public
function
onCommand(
$name
,
$args
){
if
(
$name
!=
'addUser'
){
return
false;
}
echo
'UserCommand run command addUser<br>'
;
}
}
//定义一个发送邮件的命令对象
class
MailCommand
implements
ICommand {
public
function
onCommand(
$name
,
$args
){
if
(
$name
!=
'mail'
){
return
false;
}
echo
'MailCommand run command mail<br>'
;
}
}
//定义维护命令对象列表的类
$commandChain
=
new
CommandChain();
//实例化命令对象
$user
=
new
UserCommand();
$mail
=
new
MailCommand();
//添加命令对象到列表中
$commandChain
->addCommand(
$user
);
$commandChain
->addCommand(
$mail
);
//执行命令
$commandChain
->runCommand(
'addUser'
,null);
$commandChain
->runCommand(
'mail'
,null);
|
此代码定义维护 ICommand
对象列表的 CommandChain
类。两个类都可以实现 ICommand
接口 —— 一个对邮件的请求作出响应,另一个对添加用户作出响应。
如果您运行包含某些测试代码的脚本,则会得到以下输出:
代码首先创建 CommandChain
对象,并为它添加两个命令对象的实例。然后运行两个命令以查看谁对这些命令作出了响应。如果命令的名称不匹配 UserCommand
或 MailCommand
,则代码失败,不发生任何操作。
为处理请求而创建可扩展的架构时,命令链模式很有价值,使用它可以解决许多问题。
本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1343599,如需转载请自行联系原作者