多路分发

何为多路分发:

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

多路分发的相关文章

java实现多路分发

多路分发就是指在调用a.plus(b),a和b都不知道确切类型,也能让他们正常交互. 如果想使用两路分发,那么必须有两个方法调用,第一个方法调用决定第一个未知类型,第二个方法调用决定第二个未知类型.要利用多路分发,程序员必须为每一个类型提供给一个实际的方法调用.一般而言,程序员需要设定好某种配置,以便一个方法调用能够引出更多的方法调用,从而能在这个过程中处理多个类型. 下面是个"石头 剪刀 布"(RoShamBo)游戏的例子 (from: thinking in java): [jav

枚举Enum 的常用方法

一.枚举介绍 通常定义常量方法和枚举定义常量方法区别 public class State { public static final int ON = 1; public static final Int OFF= 0; } 第一.它不是类型安全的. 你必须确保是int,其次,你还要确保它的范围是0和1. 第二.不够直观. 很多时候你打印出来的时候,你只看到 1 和0 ,但其没有看到代码的人并不知道你的企图. 抛弃你所有旧的public static final常量 枚举是一种规范它规范了参数

Java enum的用法详解

在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. enum Signal { GREEN, YELLOW, RED } public cl

[libevent]event,event_base结构体描述

libevent的核心-event Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心.event就是Reactor框架中的事件处理程序组件:它提供了函数接口,供Reactor在事件发生时调用,以执行相应的事件处理,通常它会绑定一个有效的句柄. //在event2/event_struct.h中event的结构描述 struct event { TAILQ_ENTRY (event) ev_next; /*增加下一个事件*/ TAILQ_ENT

Java Enum类语法和用法解析

一.语法 1. Enum的全称为enumeration,中文俗称枚举类,学过C/C++等语言的人,应该都对它略知一二. 但在Java语言规范中,是在JDK 5版本中才引入的,存放在 java.lang 包中.在Java版的Enum实质是语法糖,其声明方式如下: 1 package felix.fu 2 public enum Color{ 3 RED, 4 BLUE, 5 BLACK, 6 YELLOW, 7 GREEN 8 } enum是用来声明枚举的关键字,声明定义的类都隐含继承了一个父类(

flume原理及代码实现

转载标明出处:http://www.cnblogs.com/adealjason/p/6240122.html 最近想玩一下流计算,先看了flume的实现原理及源码 源码可以去apache 官网下载 下面整理下flume的原理及代码实现: flume是一个实时数据收集工具,hadoop的生态圈之一,主要用来在分布式环境下各服务器节点做数据收集,然后汇总到统一的数据存储平台,flume支持多种部署架构模式,单点agent部署,分层架构模式部署,如通过一个负载均衡agent将收集的数据分发到各个子a

Libevent初探

Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易读:跨平台,支持 Windows. Linux. *BSD 和 Mac Os:支持多种 I/O 多路复用技术, epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O,定时器和信号等事件:注册事件优先级. Libevent 已经被广泛的应用,作为底层的网络库:

Java enum(枚举)的用法详解(转)

用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. enum Signal { GREEN, YELLOW, RED } pu

分布式缓存系统 Memcached 工作线程初始化

Memcached采用典型的Master-Worker模式,其核心思想是:有Master和Worker两类进程(线程)协同工作,Master进程负责接收和分配任务,Worker进程负责处理子任务.当各Worker进程将各个子任务处理完成后,将结果返回给Master进程,由Master进程做归纳和汇总. 工作示意图如下所示: 其中每个工作线程维护一个连接队列,以接收由主线程分配的客户连接:同时每个工作线程维护一个Libevent实例,以处理和主线程间的管道通信以及和客户连接间的socket通信事件