文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>访问者模式(Visitor)---集合

访问者模式(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可以再以接口的形式变的更加灵活,这里就不举例了。。。

 

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载