设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 访问者模式(Visitor)
访问者:表示一个作用于某对象结构中的各元素的操作。可以在不改变各元素类的前提下定义作用于这些元素的新操作。
一、说明:
1、IElement 被访问对象.元素(接口);
2、ElementA 被访问对象.元素.实现类;
3、ElementB 被访问对象.元素.实现类;
4、IVisitor 访问者(接口);
5、Visitor 访问者.实现类;
6、ObjectStructure 被访问者对象.角色(拥有元素)。
二、Java实现,代码如下:
1、IElement
package com.java.designPattern.visitor;
/**
* 被访问对象.元素
*
*/
public interface IElement {
public void accept(IVisitor visitor);
public void doSomething();
}
2、ElementA
package com.java.designPattern.visitor;
/**
* 被访问对象.元素.实现类
*
*/
public class ElementA implements IElement {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
@Override
public void doSomething() {
System.out.println(this.getClass().getSimpleName() + " do something !");
}
}
3、ElementB
package com.java.designPattern.visitor;
/**
* 被访问对象.元素.实现类
*
*/
public class ElementB implements IElement {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
@Override
public void doSomething() {
System.out.println(this.getClass().getSimpleName() + " do something !");
}
}
4、IVisitor
package com.java.designPattern.visitor;
/**
* 访问者
*
*/
public interface IVisitor {
public void visit(IElement element);
}
5、Visitor
package com.java.designPattern.visitor;
/**
* 访问者.实现类
*
*/
public class Visitor implements IVisitor {
@Override
public void visit(IElement element) {
System.out.println(this.getClass().getSimpleName() + " operate " + element.getClass().getSimpleName());
element.doSomething();
}
}
6、ObjectStructure
package com.java.designPattern.visitor;
import java.util.ArrayList;
import java.util.List;
/**
* 被访问者对象.角色
*
*/
public class ObjectStructure {
private List<IElement> list = new ArrayList<IElement>();
public void addElement(IElement element) {
list.add(element);
}
public void removeElement(IElement element) {
list.remove(element);
}
public void acceptVisitor(IVisitor visitor) {
for (IElement element : list) {
element.accept(visitor);
}
}
}
7、Test
package com.java.designPattern.visitor;
/**
* 测试类
*
*/
public class Test {
public static void main(String[] args) {
ObjectStructure obj = new ObjectStructure();
obj.addElement(new ElementA());
obj.addElement(new ElementB());
obj.acceptVisitor(new Visitor());
}
}
输出:
Visitor operate ElementA
ElementA do something !
Visitor operate ElementB
ElementB do something !