访问者模式(Visitor)---集合
时间:2010-07-18 来源:wuquanyin1011
一,每一种模式都是为了解决问题而设计的,
需解决的问题:
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(String string); public void visitFloat(Float 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(String string) { System.out.println("'" + string + "'"); } public void visitFloat(Float 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(33f); } }
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 is a String type..."); } }
//------------------------------------------------------------------------------------------------
对以上类的封装
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可以再以接口的形式变的更加灵活,这里就不举例了。。。
相关阅读 更多 +