zoukankan      html  css  js  c++  java
  • 多路分发

    何为多路分发:

    java仅仅持单路分发,即假设要运行的操作包括不止一个类型未知的对象时,

    那么动态绑定机制仅仅能处理处中的一个类型,

    假设须要处理两个类型,能够使用多路分发,

    假设想使用两路分发,就必需要有两个方法调用:

    第一个方法调用决定第一个未知类型,

    第二个方法调用决定第二个未知类型


    基于接口实现


    Item

    package com.demo.multiple;
    
    /**
     * @author wobendiankun
     *2014-10-29 下午09:52:42
     */
    public interface Item {
    	ResultCode compete(Item item);
    	ResultCode eval(AA aa);
    	ResultCode eval(BB bb);
    	ResultCode eval(CC cc);
    }
    

    AA

    package com.demo.multiple;
    
    /**
     * @author wobendiankun
     *2014-10-29 下午09:51:57
     */
    public class AA implements Item {
    
    	@Override
    	public ResultCode compete(Item item) {
    		return item.eval(this);
    	}
    
    	@Override
    	public ResultCode eval(AA aa) {
    		System.out.print("AA vs AA :");
    		return ResultCode.EQ;
    	}
    
    	@Override
    	public ResultCode eval(BB bb) {
    		System.out.print("AA vs BB :");
    		return ResultCode.GT;
    	}
    
    	@Override
    	public ResultCode eval(CC cc) {
    		System.out.print("AA vs CC :");
    		return ResultCode.LT;
    	}
    
    }
    

    BB

    package com.demo.multiple;
    
    
    /**
     * @author wobendiankun
     *2014-10-29 下午09:52:09
     */
    public class BB implements Item {
    	@Override
    	public ResultCode compete(Item item) {
    		return item.eval(this);
    	}
    
    	@Override
    	public ResultCode eval(AA aa) {
    		System.out.print("BB vs AA :");
    		return ResultCode.LT;
    	}
    
    	@Override
    	public ResultCode eval(BB bb) {
    		System.out.print("BB vs BB :");
    		return ResultCode.EQ;
    	}
    
    	@Override
    	public ResultCode eval(CC cc) {
    		System.out.print("BB vs CC :");
    		return ResultCode.LT;
    	}
    }
    

    CC

    package com.demo.multiple;
    
    
    /**
     * @author wobendiankun
     *2014-10-29 下午09:52:28
     */
    public class CC implements Item {
    	@Override
    	public ResultCode compete(Item item) {
    		return item.eval(this);
    	}
    
    	@Override
    	public ResultCode eval(AA aa) {
    		System.out.print("CC vs AA :");
    		return ResultCode.GT;
    	}
    
    	@Override
    	public ResultCode eval(BB bb) {
    		System.out.print("CC vs BB :");
    		return ResultCode.GT;
    	}
    
    	@Override
    	public ResultCode eval(CC cc) {
    		System.out.print("CC vs CC :");
    		return ResultCode.EQ;
    	}
    }
    

    ResultCode

    package com.demo.multiple;
    /**
     * @author wobendiankun
     *2014-10-29 下午09:51:19
     */
    public enum ResultCode {
    	GT,EQ,LT
    }
    

    MultiDispTest

    package com.demo.multiple;
    
    /**
     * @author wobendiankun
     *2014-10-29 下午09:50:22
     */
    public class MultiDispTest {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		Item item1=new BB();
    		Item item2=new AA();
    		ResultCode result=item1.compete(item2);
    		System.out.println("	"+result);
    	}
    
    }
    

    执行结果:

    AA vs BB :	GT
    

    当运行 item1.compete(item2); 这段代码时。确定了第一个对象item1类型为BB,

    BB类的compete中又运行 item.eval(this)  。确定了第二个对象item的类型 为AA,

    利用重载方法找到了AA的方法:

    @Override
    	public ResultCode eval(BB bb) {
    		System.out.print("AA vs BB :");
    		return ResultCode.GT;
    	}



    基于枚举实现:




    Item2

    package com.demo.multiple.enums;
    
    import com.demo.multiple.Item;
    import com.demo.multiple.ResultCode;
    import com.demo.multiple.enums.ItemComparator.ItemCode;
    
    /**
     * @author wobendiankun
     *2014-10-29 下午09:53:15
     * @param <T>
     */
    public interface Item2<T extends Item2<T>> {
    	ResultCode compete(T code);
    }
    

    ItemComparator

    package com.demo.multiple.enums;
    
    import com.demo.multiple.Item;
    import com.demo.multiple.ResultCode;
    import static com.demo.multiple.ResultCode.*;
    /**
     * @author wobendiankun
     *2014-10-29 下午09:53:26
     */
    public class ItemComparator {
    	enum ItemCode implements Item2<ItemCode>{
    		AA(EQ,GT,LT),
    		BB(LT,EQ,LT),
    		CC(GT,GT,EQ);
    		private ResultCode item1;
    		private ResultCode item2;
    		private ResultCode item3;
    		
    		private ItemCode(ResultCode item1, ResultCode item2, ResultCode item3) {
    			this.item1 = item1;
    			this.item2 = item2;
    			this.item3 = item3;
    		}
    
    		/* (non-Javadoc)
    		 * @see com.demo.multiple.enums.Item2#compete(com.demo.multiple.Item)
    		 */
    		@Override
    		public ResultCode compete(ItemCode code) {
    			switch (code) {
    				case AA:
    					return item1;
    				case BB:
    					return item2;
    				case CC:
    					return item3;
    			}
    			return null;
    		}
    	}
    	public static void main(String[] args) {
    		Item2 item1=ItemCode.AA;
    		Item2 item2=ItemCode.CC;
    		System.out.println("AA vs CC :"+item1.compete(item2));
    	}
    }
    

    执行结果:

    AA vs CC :LT

    枚举实例创建时新建一条记录,compete()方法运行时:

    @Override
    		public ResultCode compete(ItemCode code) {
    			switch (code) {
    				case AA:
    					return item1;
    				case BB:
    					return item2;
    				case CC:
    					return item3;
    			}
    			return null;
    		}

    相当于查询一条记录的内容:

    字段AA--->item1

    字段BB-->item2

    字段CC-->item3

    实例初始化,创建了相应的记录

    AA(EQ,GT,LT),
    BB(LT,EQ,LT),
    CC(GT,GT,EQ)
    



  • 相关阅读:
    绝对定位和相对定位的内幕
    水平居中和垂直居中
    玩转html5<canvas>画图
    基本排序算法
    很好用的canvas
    IE浏览器存在的setAttribute bug
    js 高程 函数节流 throttle() 分析与优化
    js apply()、call() 使用参考
    js 高程 22.1.4 函数绑定 bind() 封装分析
    事件处理程序中 this 的指向
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7086248.html
Copyright © 2011-2022 走看看