定义一个类,使用它对数据类进行访问,可以减少对数据类的污染,并且可以随意定制数据展示和计算等。
类图
java实现:
数据源抽象类
public abstract class Element {
public abstract void doSomething();
public abstract void accept(IVisitor visitor);
}
数据源实现类
public class ConcreteElement1 extends Element {
@Override
public void doSomething() {
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
public class ConcreteElement2 extends Element {
@Override
public void doSomething() {
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
访问者接口
public interface IVisitor {
public void visit(ConcreteElement1 concreteElement1);
public void visit(ConcreteElement2 concreteElement2);
}
访问者实现类
public class Visitor implements IVisitor {
@Override
public void visit(ConcreteElement1 concreteElement1) {
concreteElement1.doSomething();
}
@Override
public void visit(ConcreteElement2 concreteElement2) {
concreteElement2.doSomething();
}
}
php实现
abstract class Element
{
public abstract function doSomething();
public abstract function accept(IVisitor $visitor);
}
class ConcreteElement1 extends Element
{
public function doSomething()
{
echo 'ConcreteElement1';
}
public function accept(IVisitor $visitor)
{
$visitor->visit($this);
}
}
class ConcreteElement2 extends Element
{
public function doSomething()
{
echo 'ConcreteElement2';
}
public function accept(IVisitor $visitor)
{
$visitor->visit($this);
}
}
interface IVisitor
{
public function visit(Element $element);
}
class Visitor implements IVisitor
{
public function visit(Element $element)
{
$element->doSomething();
}
}
$visitor = new Visitor;
$element1 = new ConcreteElement1;
$element1->accept($visitor);
$element2 = new ConcreteElement2;
$element2->accept($visitor);