作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.
在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作的行为.
目的:
不同的被访问对象,要求的响应访问的操作实现不同,不同的访问者要求对同一个对象访问实现不同,
就是两者都要保持各自独立变化,彼此不影响。
分析:首先封装了一个访问者接口,目的是实现不同访问者对同一对象的不同访问操作。
另外封装了另外一个接口:被访问者接口(或称对象接口),该接口封装了不同
对象对“同一访问者”(实际上是“访问者接口”)的不同响应
////////////////完整测试代码如下:////////////////
import java.util.*;
//定义被访问类的接口
interface Visitable
{
//该方法由具体实现类实现,在具体类中,可根据自身特点实现
public void accept(Visitor visitor);
}
//具体的被访问类
class StringElement implements Visitable
{
private String value;
public StringElement(String string)
{
value =string;
}
public String getValue()
{
return value;
}
//该函数是关键。调用具体的行为函数。
//该函数是明显的针对接口编程(Visitor接口)。
//这是一个中间环节。还需要进一步调用具体处理,如visitString。
//如果只是根据被访问对象的不同,做出不同相应操作,这里就不用传递Visitor参数了,
//但是问题是不同访问者可能存在对同一对象访问不同的情况。所以还必须使用另一个接口
//Visitor来表示。
public void accept(Visitor visitor)
{
visitor.visitString(this);
}
}
//具体的被访问类
class FloatElement implements Visitable
{
private Float value;
public FloatElement(Float value) {
this.value = value;
}
public Float getValue(){
return value;
}
public void accept(Visitor visitor)
{
visitor.visitFloat(this);
}
}
//定义访问者接口
interface Visitor
{
//定义不同的行为访问方法
public void visitString(StringElement stringE);
public void visitFloat(FloatElement floatE);
//定义遍历集合接口
public void visitCollection(Collection collection);
}
//具体的访问者,实现接口。具体实现对不同的的对象的调用
class ConcreteVisitor implements Visitor
{
//对StringElement对象的处理
public void visitString(StringElement stringE)
{
System.out.println("'"+stringE.getValue()+"'");
}
//对FloatElementt对象的处理
public void visitFloat(FloatElement floatE)
{
System.out.println(floatE.getValue().toString()+"f");
}
//写集合处理函数,在此需要遍历集合。系统自动根据对象类型进行不同处理
public void visitCollection(Collection collection)
{
Iterator iterator = collection.iterator();
while(iterator.hasNext())
{
Object o = iterator.next();
if(o instanceof Visitable) //只需要一个判断即可。
((Visitable)o).accept(this);
}
}
}
//客户端代码
public class VisitTest
{
public static void main(String args[])
{
Visitor visitor = new ConcreteVisitor();
StringElement stringE = new StringElement("I am a String");
visitor.visitString(stringE);
Collection list = new ArrayList();
list.add(new StringElement("I am a String1"));
list.add(new StringElement("I am a String2"));
list.add(new FloatElement(new Float(12)));
list.add(new StringElement("I am a String3"));
visitor.visitCollection(list);
}
}
///////////////////代码结束//////////////////////
特点:使用时候,不需要要再根据具体的类,进行不同的判断,如if(o instanceof Visitable)
// 如何实现内,先考虑定义一个抽象接口来表示各个类,然后不同类来实现该接口,使用时候
// 只需要用接口表示(针对接口编程而非实现编程)。但是因为是展开的操作,所以单纯的抽象
// 类不能解决行为问题,所以需要添加一个抽象的方法,来表示同一行为,在此就是accept方法
// 所以抽象类内不在增加一个accept函数。
阅读(2487) | 评论(0) | 转发(0) |