以下是一个简单的 PHP 访问者模式的示例:
<?php
// 元素接口
interface Element {
public function accept(Visitor $visitor);
}
// 具体元素类1
class ConcreteElement1 implements Element {
public function accept(Visitor $visitor) {
$visitor->visitElement1($this);
}
public function operationElement1() {
echo "Operation for ConcreteElement1\n";
}
}
// 具体元素类2
class ConcreteElement2 implements Element {
public function accept(Visitor $visitor) {
$visitor->visitElement2($this);
}
public function operationElement2() {
echo "Operation for ConcreteElement2\n";
}
}
// 访问者接口
interface Visitor {
public function visitElement1(ConcreteElement1 $element1);
public function visitElement2(ConcreteElement2 $element2);
}
// 具体访问者类
class ConcreteVisitor implements Visitor {
public function visitElement1(ConcreteElement1 $element1) {
echo "Visitor is visiting ConcreteElement1\n";
$element1->operationElement1();
}
public function visitElement2(ConcreteElement2 $element2) {
echo "Visitor is visiting ConcreteElement2\n";
$element2->operationElement2();
}
}
// 客户端代码
$element1 = new ConcreteElement1();
$element2 = new ConcreteElement2();
$visitor = new ConcreteVisitor();
$element1->accept($visitor);
$element2->accept($visitor);
在这个例子中,Element 接口定义了元素的基本方法 accept,用于接受访问者的访问。ConcreteElement1 和 ConcreteElement2 是具体元素类,分别实现了 Element 接口。
Visitor 接口定义了访问者的基本方法 visitElement1 和 visitElement2,用于访问具体的元素类。ConcreteVisitor 是具体访问者类,实现了 Visitor 接口,定义了对两个具体元素类的访问操作。
客户端代码创建了两个具体元素对象和一个具体访问者对象,然后通过调用元素的 accept 方法来接受访问者的访问。
访问者模式适用于访问的操作比较稳定,但数据结构经常发生变化的场景。通过访问者模式,可以在不改变元素类的前提下,新增访问者和访问操作。这使得代码更加灵活且易于维护。
转载请注明出处:http://www.pingtaimeng.com/article/detail/11964/PHP