访问者模式

二一. 访问者模式
整理自 《java与模式》阎宏编著

1.意图:

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。

2.类图:

[img]http://eneasy.iteye.com/upload/picture/pic/10107/b3b438b5-4beb-3016-ba00-43d44dd03bcf.jpg[/img]

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);

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值