-
Notifications
You must be signed in to change notification settings - Fork 14
/
Visitor2.class.php
executable file
·149 lines (129 loc) · 2.75 KB
/
Visitor2.class.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
146
147
148
149
<?php
/**
* PHP设计模式 之 访问者模式
*/
/**
* 元素结构层次
*/
/**
* 元素抽象类
*/
abstract class Browser {
public $name;
/**
* 接受访问者的访问
* @param Object $visitor
*/
public abstract function accept($visitor);
}
/**
* 具体元素类实现
* 浏览设备:电脑
*/
class PCBrowser extends Browser {
/**
* 实现抽象类的抽象方法
* @see Browser::accept()
*/
public function accept($visitor){
$visitor->visitPCBrowser($this);
}
}
/**
* 具体元素类实现
* 浏览设备:手机
*/
class MBBrowser extends Browser {
/**
* 实现抽象类的抽象方法
* @see Browser::accept()
*/
public function accept($visitor){
$visitor->visitMBBrowser($this);
}
}
/**
* 访问者抽象接口
*/
interface IVisitor {
/**
* 电脑设备访问者类型访问,作用于具体元素的操作
* @param PCBrowser $pc
*/
public function visitPCBrowser($pc);
/**
* 手机设备访问者类型访问,作用于具体元素的操作
* @param MBBrowser $mb
*/
public function visitMBBrowser($mb);
}
/**
* 具体访问者类实现
* 设备来源分析
*/
class EquipmentAnalyze implements IVisitor {
/**
* 电脑设备来源
* @see IVisitor::visitPCBrowser()
*/
public function visitPCBrowser($pc){
//do ...
echo '电脑访问,浏览器是'.$pc->name."\n";
}
/**
* 手机设备来源
* @see IVisitor::visitMBBrowser()
*/
public function visitMBBrowser($mb){
//do ...
echo '手机访问,浏览器是'.$mb->name."\n";
}
}
/**
* 结构对象
* 作用:管理访问者,提供访问元素接口
*/
class ObjectStructure {
private $visitor = array();
/**
* 新增访问者
* @param Object $vis
*/
public function addVisitor($vis){
if(is_object($vis)){
$this->visitor[spl_object_hash($vis)] = $vis;
}
}
/**
* 删除访问者
* @param Object $vis
*/
public function delVisitor($vis){
if(is_object($vis)){
unset($this->visitor[spl_object_hash($vis)]);
}
}
/**
* 访问者访问元素接口
* @param Object $vistor
*/
public function handler($vistor){
foreach ($this->visitor as $obj){
$obj->accept($vistor);
}
}
}
///创建访问者管理对象
$os = new ObjectStructure();
///创建具体元素
$pc = new PCBrowser();
$pc->name = '360';
$os->addVisitor($pc);
///创建具体元素
$mb = new MBBrowser();
$mb->name = 'uc';
$os->addVisitor($mb);
///创建访问者
$vistor = new EquipmentAnalyze();
///作用于$os->visitor集合的各个元素
$os->handler($vistor);