何为多路分发:
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)
时间: 2024-11-05 06:08:57