一、访问者模式的概念
访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
将数据操作和数据结构分离的设计模式
访问者角色[Visitor]:定义了对每个 Element 访问的行为,它的参数就是被访问的元素,它的方法个数理论上与元素的个数是一样的,因此,访问者模式要求元素的类型要稳定,如果经常添加、移除元素类,必然会导致频繁地修改Visitor接口,如果出现这种情况,则说明不适合使用访问者模式
具体访问者角色[Concrete Visitor]:实现Visitor声明的操作,需要给出对每一个元素类访问时所产生的具体行为
元素角色[Element]:抽象类或者接口,定义一个Accept操作,它以访问者为参数
具体元素角色[Concrete Element]:具体的元素类,它提供接受访问的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法
对象结构角色[Object Structure]:这是使用访问者模式必备的角色,能枚举它的元素,可以提供一个高层的接口以允许该访问者访问它的元素
二、访问者模式的实现
//访问者
public interface IVisitor {
void visit(ConcreteElement1 e1);
void visit(ConcreteElement2 e2);
}
//具体访问者
public class Visitor implements IVisitor
{
@Override
public void visit(ConcreteElement1 e1)
{
e1.doSomething();
}
@Override
public void visit(ConcreteElement2 e2)
{
e2.doSomething();
}
}
//元素
public abstract class Element
{
public abstract void accept(IVisitor visitor);
public abstract void doSomething();
}
//具体元素
public class ConcreteElement1 extends Element
{
@Override
public void accept(IVisitor visitor)
{
visitor.visit(this);
}
@Override
public void doSomething()
{
System.out.println("Element1");
}
}
//具体元素
public class ConcreteElement2 extends Element
{
@Override
public void accept(IVisitor visitor)
{
visitor.visit(this);
}
@Override
public void doSomething()
{
System.out.println("Element2");
}
}
//对象结构
public class ObjectStructure
{
public static List<Element> getList()
{
List<Element> list = new ArrayList<Element>();
Random ran = new Random();
for(int i=0;i<10;i++)
{
int a = ran.nextInt(100);
if(a>50)
list.add(new ConcreteElement1());
else
list.add(new ConcreteElement2());
}
return list;
}
}
public class Main {
public static void main(String[] args) {
List<Element> list = ObjectStructure.getList();
for(Element e:list){
e.accept(new Visitor());
}
}
}
三、访问者模式的应用
- 对象结构比较稳定,但经常需要在此对象结构上定义新的操作
- 需要对一个对象结构中的对象进行很多不同的且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类
四、访问者の其他问题
各角色职责分离,符合单一职责原则;具有优秀的扩展性;使得数据结构和作用于结构上的操作解耦,使得操作集合可以独立变化;灵活性
具体元素对访问者公布细节,违反了迪米特原则;具体元素变更时导致修改成本大;违反了依赖倒置原则,为了达到“区别对待”而依赖了具体类,没有以来抽象
五、Reference
六、Resource