一,每一种模式都是为了解决问题而设计的,
需解决的问题:
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可以再以接口的形式变的更加灵活,这里就不举例了。。。