首页 > 代码库 > 多路分发
多路分发
何为多路分发:
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); }
AApackage 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; } }
BBpackage 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; } }
CCpackage 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; } }
ResultCodepackage com.demo.multiple; /** * @author wobendiankun *2014-10-29 下午09:51:19 */ public enum ResultCode { GT,EQ,LT }
MultiDispTestpackage 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("\t"+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); }
ItemComparatorpackage 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)
多路分发
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。