访问者模式(Visitor)---集合

一,每一种模式都是为了解决问题而设计的,

需解决的问题:

 

Iterator iterator = collection.iterator()
while (iterator.hasNext()) {
   Object o = iterator.next();
       if (o instanceof StringType)
      System.out.println("'"+o.toString()+"'");
   else if (o instanceof FloatType)
      System.out.println(o.toString()+"");
   else
      System.out.println(o.toString());
}

 

像这种集合中的黑箱操作,迭代出来都要对其判断类型,如果要对集合中添加了其他的类型,还要对其多添加一个判断,这样的操作违反了开闭原则,这种模式就是为了解决这个问题。。。

 

模式实现

 

 

package com.wqy.visitor;
/**
 * 对予以进行逻辑判断的类型进行抽象
 * 
 * @author wu_quanyin(09817)
 * @version 1.0
 * @date Jul 18, 2010 5:30:26 AM
 */
public interface Visitor
{
	public void visitString(StringType string);
	public void visitFloat(FloatType mflat);
}

 对其进行实现。。

 

package com.wqy.visitor;

/**
 * @author wu_quanyin(09817) 
 * @version 1.0
 * @date Jul 18, 2010 5:33:51 AM
 */
public class ConcreteVisitor implements Visitor {
	public void visitString(StringType string) {
		System.out.println("'" + string + "'");
	}

	public void visitFloat(FloatType flat) {
		System.out.println(flat.toString() + "f");
	}
}

 //-------------------------------------------------------------------------------------------------------------------------

对里面拥有的每一个类型进行封装

 

 

package com.wqy.visitor;
/**
 * 
 * @author wu_quanyin(09817)
 * @version 1.0
 * @date Jul 18, 2010 5:32:01 AM
 */
public interface Visitable
{
	public void accept(Visitor visitor);
}

 FloatType

 

package com.wqy.visitor;
/**
 * @author wu_quanyin(09817) 
 * @version 1.0
 * @date Jul 18, 2010 5:32:38 AM
 */
public class FloatType implements Visitable
{
	public FloatType() {
	}
	public void accept(Visitor visitor) {
		visitor.visitFloat(this);
	}
}

 StringType

 

package com.wqy.visitor;

/**
 * @author wu_quanyin(09817) 
 * @version 1.0
 * @date Jul 18, 2010 5:32:38 AM
 */
public class StringType implements Visitable
{
	public StringType() {
	}
	//定义accept的具体内容 这里是很简单的一句调用
	public void accept(Visitor visitor) {
		visitor.visitString(this);
	}
}

 //------------------------------------------------------------------------------------------------

   对以上类的封装

 

package com.wqy.visitor;

import java.util.Enumeration;
import java.util.Vector;

/**
 * @author wu_quanyin(09817) 
 * @version 1.0
 * @date Jul 18, 2010 5:38:29 AM
 */
public class ObjectStructure {

	private Vector typeCollections =new Vector();
	public ObjectStructure(){
	}
	
   /**
    * 只要实现了visitable接口,作弄可任意添加
    * @param object
    */
	public void addType(Object object){
		typeCollections.add(object);
	}
	
	/**
	 * 对添加进的类型进行访问执行
	 * @param vistor
	 */
	public void action(Visitor vistor){
		for(Enumeration e=typeCollections.elements();e.hasMoreElements();){
			Object o=e.nextElement();
				if(o instanceof Visitable)
					((Visitable)o).accept(vistor);
		}
	}
}
 

测试:

 

package com.wqy.visitor;
/**
 * 
 * @author wu_quanyin(09817)
 * @version 1.0
 * @date Jul 18, 2010 5:37:55 AM
 */
public class Client {

	public static void main(String[] args) {
		Visitable floatType=new FloatType();
		Visitable stringType=new StringType();
		ObjectStructure objectStruct=new ObjectStructure();
		objectStruct.addType(floatType);
		objectStruct.addType(stringType);
		
		Visitor visitor=new ConcreteVisitor();
		
		objectStruct.action(visitor);
		
	}
}

 以上的设计,1只要不要对每一个类型进行判断2Visitable是变化的,你若要为集合添加其他的类型,只要实现这个接口,添加进集合就可以了。满足‘开闭原则’,当然如果也要去为vistor添加其实现,但是visitor可以再以接口的形式变的更加灵活,这里就不举例了。。。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值