二一. 访问者模式
整理自 《java与模式》阎宏编著
1.意图:
封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。
2.类图:
3.原理:
4.特征:
抽象访问者(Visitor)角色:定义接口,声明一个或多个访问操作。
具体访问者(ConcreteVisitor)角色:实现抽象访问者所声明的接口,也就是抽象访问者所声明的各个访问操作。
抽象元素(Element)角色:声明一个接受操作,接受一个访问者对象作为一个参数。
具体元素结点(ConcreteElement)角色:实现抽象结点所规定的接受操作。
数据结构对象(ObjectStructure)角色:可以遍历结构中的所有元素,提供一个接口让访问者对象都可以访问每一个元素。
5.说明:
访问者模式仅应当用于数据结构非常稳定的情况下使用,它把数据结构和作用于数据结构上的操作之间的耦合脱开,使得操作集合可以相对自由地演化。
数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作。这样的过程叫做“双重分派”。
6.使用案例:
7.代码:
//抽象访问者(Visitor)角色 Visitor.java
/**
* 抽象访问者为每个具体节点都定义了一个访问操作,由于只有两个结点,只定义了两个操作。
*/
public interface Visitor
{
void visit (ConcreteElementA element);
void visit (ConcreteElementB element);
}
//具体访问者(ConcreteVisitor)角色 ConcreteVisitorA.java
public class ConcreteVisitorA implements Visitor
{
public void visit(ConcreteElementA element)
{
System.out.print(element.operateA());
}
public void visit(ConcreteElementB element)
{
System.out.print(element.operateB());
}
}
//具体访问者(ConcreteVisitor)角色 ConcreteVisitorB.java
public class ConcreteVisitorB implements Visitor
{
public void visit(ConcreteElementA element)
{
System.out.print(element.operateA());
}
public void visit(ConcreteElementB element)
{
System.out.print(element.operateB());
}
}
//抽象元素(Element)角色 Element.java
public interface Element
{
/**
* 声明一个接受操作
*/
void accept(Visitor visitor);
}
//具体元素结点(ConcreteElement)角色 ConcreteElementA.java
public class ConcreteElementA implements Element
{
public void accept(Visitor visitor)
{
visitor.visit(this);
}
/**
* ConcreteElementA 特有的商业方法
*/
public String operateA()
{
return "operateA";
}
}
//具体元素结点(ConcreteElement)角色 ConcreteElementB.java
public class ConcreteVisitorB implements Visitor
{
public void visit(ConcreteElementA element)
{
System.out.print(element.operateA());
}
public void visit(ConcreteElementB element)
{
System.out.print(element.operateB());
}
}
//数据结构对象(ObjectStructure)角色 ObjectStructure.java
public class ObjectStructure
{
private Vector elements;
ObjectStructure()
{
elements = new Vector();
}
/**
* 执行访问操作
* @param visitor
*/
public void action(Visitor visitor)
{
for(Object obj : elements)
{
Element e = (Element)obj;
e.accept(visitor);
}
}
public void add(Element element)
{
elements.add(elements);
}
}
//客户端
public class Client
{
private static ObjectStructure aObjects;
private static Visitor visitor;
public void main(String[] args)
{
aObjects = new ObjectStructure();
aObjects.add(new ConcreteElementA());
aObjects.add(new ConcreteElementB());
////创建一个新的访问者,让访问者访问结构
visitor = new ConcreteVisitorA();
aObjects.action(visitor);
//创建一个新的访问者,让访问者访问结构
visitor = new ConcreteVisitorB();
aObjects.action(visitor);
}
}
分享到:
相关推荐
设计模式C++学习之访问者模式(Visitor)
访问者模式Demo
设计模式 - 访问者模式
68丨访问者模式(上):手把手带你还原访问者模式诞生的思维过程1
最简单的访问者模式讲解代码,设计模式可看看博客中简介http://blog.sina.com.cn/s/blog_161d504630102wxis.html
建造者模式组合模式访问者模式 abstract class Bulider{ public abstract void BuildPartA() ; public abstract void BuildPartB() ; public abstract Product GetResult() ; }
访问者模式的小例子
访问者模式代码
访问者模式的第二个例子
java设计模式之访问者模式,通过实际例子说明访问者模式原理和适用场景;
访问者模式,你绝对会用到的模式,值得学习,通俗易懂的实例,原理和运用都说明白了。
设计模式之访问者模式Java版本的实现和UML类图
设计模式的访问者模式的例子,希望对大家有用~~~~~~~~
C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载
设计模式-访问者模式(讲解及其实现代码)
ios 平台实现设计模式-访问者模式,以最简单的代码实现访问者模式讲解,主旨在于了解访问者模式,博客:http://blog.sina.com.cn/s/blog_161d504630102wwxe.html
访问者模式(Visitor) 用意:适用于数据结构相对未定的系统,把数据结构和作用于结构上的操作间的耦合解开。
访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。