1、访问者模式
该模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其他的修改的效果。
该模式的优点是:增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不形象系统数据结构,
其缺点是:增加新的数据结果很困难。
涉及角色:
1、Visitor抽象访问者角色,该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色Element,这样访问者就可以通过该元素角色的
特定接口直接访问它。
2、ConcreteVisitor:具体访问者角色,实现Visitor接口。
3、Element定义一个接受访问操作accept(Visitor visitor)。
4、ConcreteElement:具体元素对象。
5、ObjectStructure:结构对象角色,这是使用访问者模式必备的角色。他具备以下特性:能枚举他的元素;可以提供一个高层次的接口以
允许访问他的元素,如有需要,可以设计成一个复合对象或者一个聚集。
实例一:
public interface Visitor {
public void visit(Element element);
}
public class ConcreteVisitorA implements Visitor {
@Override
public void visit(final Element element) {
System.out.println(" element : " + element);
}
}
public interface Element {
public void accept(Visitor visitor);
}
public class ConcreteElementA implements Element {
@Override
public void accept(final Visitor visitor) {
visitor.visit(this);
}
}
public class ObjectStruct {
private List<Element> list = new ArrayList<Element>();
public void addE(final Element ele) {
this.list.add(ele);
}
public void removeE(final Element ele) {
this.list.add(ele);
}
public void objectAccept(final Visitor visitor) {
for (final Element ele : this.list) {
ele.accept(visitor);
}
}
}
模拟调用:
public static void main(final String[] args) {
final ObjectStruct os = new ObjectStruct();
os.addE(new ConcreteElementA());
os.addE(new ConcreteElementA());
final Visitor v = new ConcreteVisitorA();
os.objectAccept(v);
}