首页 > 代码库 > 多路分发

多路分发

何为多路分发:

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)



多路分发