-
Notifications
You must be signed in to change notification settings - Fork 50
/
Copy pathvisitor.php
144 lines (126 loc) · 2.94 KB
/
visitor.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
<?php
/**
* Created by PhpStorm.
* User: lock
* Date: 2017/8/14
* Time: 16:10
* 访问者模式
* 访问者模式表示一个作用于某对象结构中的各元素的操作。
* 它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
*/
/**
* Class Customer
* 客户抽象接口
*/
abstract class Customer {
protected $customerId;
protected $customerName;
/**
*接受访问者的访问
*
* @param $visitor ServiceRequestVisitor
*/
abstract public function accept(ServiceRequestVisitor $visitor);
}
/**
* 具体元素,企业客户
* Class EnterpriseCustomer
*/
class EnterpriseCustomer extends Customer {
/**
*接受访问者
*
* @param $visitor Servicerequestvisitor
*/
public function accept(ServiceRequestVisitor $visitor) {
$visitor->visitEnerpriseCustomer($this);
}
}
/**
* 具体元素,个人客户
* Class PersonalCustomer
*/
class PersonalCustomer extends Customer {
/**
* 接受访问者
*
* @param ServiceRequestVisitor $visitor
*/
public function accept(ServiceRequestVisitor $visitor) {
$visitor->visitPersonalCustomer($this);
}
}
/**
*访问者接口
*/
interface Visitor {
/**
* 访问企业用户
*
* @param EnterpriseCustomer $ec
* @return mixed
*/
public function visitEnerpriseCustomer(EnterpriseCustomer $ec);
/**
* 访问个人用户
*
* @param PersonalCustomer $pc
* @return mixed
*/
public function visitPersonalCustomer(PersonalCustomer $pc);
}
/**
* 具体的访问者
* 对服务提出请求
* Class ServiceRequestVisitor
*/
class ServiceRequestVisitor implements Visitor {
//访问企业客户
public function visitEnerpriseCustomer(EnterpriseCustomer $ec) {
echo $ec->name . '企业提出服务请求。' . PHP_EOL;
}
//访问个人用户
public function visitPersonalCustomer(PersonalCustomer $pc) {
echo '客户' . $pc->name . '提出请求。' . PHP_EOL;
}
}
/**
*对象结构
*存储要访问的对象
*/
class ObjectStructure {
/**
*存储客户对象
*
* @var array
*/
private $obj = array();
public function addElement($ele) {
array_push($this->obj, $ele);
}
/**
*处理请求
*
* @param $visitor Visitor
*/
public function handleRequest(Visitor $visitor) {
//遍历对象结构中的元素,接受访问
foreach ($this->obj as $ele) {
$ele->accept($visitor);
}
}
}
//对象结构
$os = new ObjectStructure();
//添加元素
$ele1 = new EnterpriseCustomer();
$ele1->name = 'ABC集团';
$os->addElement($ele1);
$ele2 = new EnterpriseCustomer();
$ele2->name = 'DEF集团';
$os->addElement($ele2);
$ele3 = new PersonalCustomer();
$ele3->name = '张三';
$os->addElement($ele3);
$serviceVisitor = new ServiceRequestVisitor();
$os->handleRequest($serviceVisitor);