多路分發
阿新 • • 發佈:2017-06-27
args _id out 兩個類 avi rac 兩個 pack nbsp
何為多路分發:
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)
多路分發