本文共 2576 字,大约阅读时间需要 8 分钟。
本系列博客是自己在学习设计模式过程中收集整理的文章集合,其他文章参看
本文是转载文章,原文请参考
访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式,这就是访问者模式的模式动机。
访问者模式即表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据结构相对稳定的系统,又有易于变化的算法。
访问者模式的角色:
访问者角色
public interface IVistor{ public void visit(ConcreteElement1 e1); public void visit(ConcreteElement2 e2);}
元素角色
public abstract class Element{ public abstract void accept(IVistor visitor); public abstract void doSomething();}
具体访问者角色
public class Visitor implements IVistor{ @Override public void visit(ConcreteElement1 e1) { e1.doSomething(); } @Override public void visit(ConcreteElement2 e2) { e2.doSomething(); }}
具体元素角色
public class ConcreteElement1 extends Element{ @Override public void accept(IVistor visitor) { visitor.visit(this); } @Override public void doSomething() { System.out.println("Element1"); }}public class ConcreteElement2 extends Element{ @Override public void accept(IVistor visitor) { visitor.visit(this); } @Override public void doSomething() { System.out.println("Element2"); }}
对象结构角色
public class ObjectStructure{ public static ListgetList() { List list = new ArrayList (); 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; }}
测试代码
Listlist = ObjectStructure.getList(); for(Element e:list){ e.accept(new Visitor()); }
1. 优点
2. 缺点
增加新的元素类比较困难。在访问者类中,每一个元素类都有它对应的处理方法,也就是说,每增加一个元素类都需要修改访问者类,修改起来相当麻烦。也就是说,在元素类数目不确定的情况下,应该慎用访问者模式。
想要在项目中使用访问者模式的话,可以模仿上面代码的写法。先模仿再创新。