访问者模式(Visitor):表示一个作用于某对象结构中的元素的操作。它可以在不改变各个元素的类的前提定义作用于这些元素的新操作。(开闭)
类图:
代码:
publicinterface Element {
void operaion(Visitor visitor);
}
publicinterface Visitor {
publicvoid visitA(ConcreteElementA A);
publicvoid visitB(ConcreteElementB B);
}
publicclass ConcreteElementA implements Element {
@Override
publicvoid operaion(Visitor visitor) {
System.out.println(visitor.getClass().getSimpleName()+"+ConcreteElementA");
}
}
publicclass ConcreteElementB implements Element {
@Override
publicvoid operaion(Visitor visitor) {
System.out.println(visitor.getClass().getSimpleName()+"+ConcreteElementB");
}
}
publicclass ConcreteVisitor implements Visitor {
@Override
publicvoid visitA(ConcreteElementA A) {
A.operaion(this);
}
@Override
publicvoid visitB(ConcreteElementB B) {
B.operaion(this);
}
}
publicclass ObjectStructure {
private List<Element> elements=new ArrayList<Element>();
publicvoid Attach(Element element)
{
elements.add(element);
}
publicvoid Detach(Element element)
{
elements.remove(element);
}
publicvoid Accept(Visitor visitor)
{
for(Element e : elements)
{
e.operaion(visitor);
}
}
}
publicstaticvoid main(String[] args) {
ObjectStructure o = new ObjectStructure();
o.Attach(new ConcreteElementA());
o.Attach(new ConcreteElementB());
Visitor v1 = new ConcreteVisitor();
o.Accept(v1);
}
好处:扩展访问者类比较方便。
坏处:元素类和访问者类耦合度非常大。对于扩展元素类就要修改全部的访问者类。
访问者模式本身比较复杂,但功能也相对的比较强大。访问者模式比较适用于对元素类(数据机构)比较稳定的系统。如果元素不稳定此模式就不能使用。抽象工厂,桥接模式,访问者模式都是针对于网状结构的数据结构。