多路分发
Posted mthoutai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多路分发相关的知识,希望对你有一定的参考价值。
何为多路分发:
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("\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); }
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)
以上是关于多路分发的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段