访问者模式(visitor pattern)的目的是封装一些于某种数据结构元素之上的操作,一旦这些元素需要修改,接受这个操作的数据结构则可以保持不变。
定义:
访问者模式的类图如下。
访问者模式涉及以下5个角色。
element.java
// 抽象元素角色 public abstract class element { // 接受操作 public abstract void accept(visitor vi); }
concreteelement1.java
// 具体元素1 public class concreteelement1 extends element { @override public void accept(visitor vi) { vi.visit(this); } // 业务逻辑方法 public void operation() { system.out.println("访问元素1"); } }
concreteelement2.java
//具体元素2 public class concreteelement2 extends element { @override public void accept(visitor vi) { vi.visit(this); } // 业务逻辑方法 public void operation() { system.out.println("访问元素2"); } }
visitor.java
// 抽象访问者 public interface visitor { // 可以访问哪些对象 public void visit(concreteelement1 el1); public void visit(concreteelement2 el2); }
concretevisitor.java
// 具体访问者角色 public class concretevisitor implements visitor { // 访问元素1 @override public void visit(concreteelement1 el1) { el1.operation(); } // 访问元素2 @override public void visit(concreteelement2 el2) { el2.operation(); } }
objectstructure.java
// 结构对象角色 public class objectstructure { private vector<element> elements; // 构造函数 public objectstructure() { this.elements = new vector<element>(); } // 执行访问操作 public void action(visitor vi) { for (element e : elements) { e.accept(vi); } } // 添加新元素 public void add(element e) { elements.add(e); } // 元素生成器,这里通过一个工厂方法进行模拟 public void createelements() { random rand = new random(); for (int i = 0; i < 10; i++) { if (rand.nextint(100) > 50) { // 添加元素1 this.add(new concreteelement1()); } else { // 添加元素2 this.add(new concreteelement2()); } } } }
client.java
public class client { public static void main(string[] args) { // 创建一个结构对象 objectstructure os = new objectstructure(); // 生成元素 os.createelements(); // 创建一个访问者对象 visitor vi = new concretevisitor(); // 访问者对结构进行访问(执行访问) os.action(vi); } }
运行结果如下所示。
访问元素1 访问元素1 访问元素1 访问元素2 访问元素2 访问元素2 访问元素1 访问元素1 访问元素1 访问元素2
优点:
缺点:
应用场景:
摘自:
青岛东合信息技术有限公司 . 设计模式(java版) . 电子工业出版社,2012,161-166.
如对本文有疑问, 点击进行留言回复!!
软件设计模式六大原则-接口隔离原则 Interface Segregation Principle
设计模式之解释器模式(附:SpelExpressionParser中解释器模式应用分析)
网友评论