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)
    



  • 相关阅读:
    LeetCode剑指Offer03
    腾讯软件开发客户端开发实习生二面
    luogu P2801 教主的魔法 分块
    luogu P3396 哈希冲突 根号算法
    luogu P1972 [SDOI2009]HH的项链 树状数组
    BZOJ 2440: [中山市选2011]完全平方数 莫比乌斯函数 容斥原理 二分答案
    柳阴直,烟里丝丝弄碧
    卡通别名
    它们
    高中随笔
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7086248.html
Copyright © 2011-2022 走看看