多路分发

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)



































以上是关于多路分发的主要内容,如果未能解决你的问题,请参考以下文章

这两个代码片段有啥区别?

Reactor 线程模型

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

Vue_(组件通讯)使用solt分发内容

计算机网络3.1 运输层概述 与 多路复用/分解

Reactor模式和Proactor模式