Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7279045
  • 博文数量: 512
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6857
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(512)

文章存档

2024年(2)

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: Java

2006-08-11 11:57:08

作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.

在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) |
0

上一篇:多态(Polymorphism)

下一篇:格言联璧

给主人留下些什么吧!~~