java实现多路分发

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

下面是个“石头 剪刀 布”(RoShamBo)游戏的例子 (from: thinking in java):

public enum Outcome { WIN, LOSE, DRAW } ///:~


interface Item {
	Outcome compete(Item it);

	Outcome eval(Paper p);

	Outcome eval(Scissors s);

	Outcome eval(Rock r);
}

class Paper implements Item {
	public Outcome compete(Item it) {
		return it.eval(this);
	}

	public Outcome eval(Paper p) {
		return DRAW;
	}

	public Outcome eval(Scissors s) {
		return WIN;
	}

	public Outcome eval(Rock r) {
		return LOSE;
	}

	public String toString() {
		return "Paper";
	}
}

class Scissors implements Item {
	public Outcome compete(Item it) {
		return it.eval(this);
	}

	public Outcome eval(Paper p) {
		return LOSE;
	}

	public Outcome eval(Scissors s) {
		return DRAW;
	}

	public Outcome eval(Rock r) {
		return WIN;
	}

	public String toString() {
		return "Scissors";
	}
}

class Rock implements Item {
	public Outcome compete(Item it) {
		return it.eval(this);
	}
	
	public Outcome eval(Paper p) {
		return WIN;
	}

	public Outcome eval(Scissors s) {
		return LOSE;
	}

	public Outcome eval(Rock r) {
		return DRAW;
	}

	public String toString() {
		return "Rock";
	}
}

public class RoShamBo1 {
	static final int SIZE = 20;
	private static Random rand = new Random(47);

	public static Item newItem() {
		switch (rand.nextInt(3)) {
		default:
		case 0:
			return new Scissors();
		case 1:
			return new Paper();
		case 2:
			return new Rock();
		}
	}

	public static void match(Item a, Item b) {
		System.out.println(a + " vs. " + b + ": " + a.compete(b));
	}

	public static void main(String[] args) {
		for (int i = 0; i < SIZE; i++)
			match(newItem(), newItem());
	}
} 

RoshamBol.match()有2个item参数,通关过Item.compete()方法开始2路分发,要判定a的类型,分发机制会在a的实际类型的compete()内部起到分发作用。compete()方法通关过eval()来为另一个类型实现第二次分发, 将自身(this)作为参数调用eval(),能够调用重载过的eval()方法,这能够保留第一次分发的类型信息,第二次分发完成时,就能知道两个Item对象的具体类型了。



使用EnumMap分发:


enum RoShamBo5 implements Competitor<RoShamBo5> {
	PAPER, SCISSORS, ROCK;
	static EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>> table = new EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>>(
			RoShamBo5.class);

	static {
		for (RoShamBo5 it : RoShamBo5.values())
			table.put(it, new EnumMap<RoShamBo5, Outcome>(RoShamBo5.class));
		initRow(PAPER, DRAW, LOSE, WIN);
		initRow(SCISSORS, WIN, DRAW, LOSE);
		initRow(ROCK, LOSE, WIN, DRAW);
	}

	static void initRow(RoShamBo5 it, Outcome vPAPER, Outcome vSCISSORS,
			Outcome vROCK) {
		EnumMap<RoShamBo5, Outcome> row = RoShamBo5.table.get(it);
		row.put(RoShamBo5.PAPER, vPAPER);
		row.put(RoShamBo5.SCISSORS, vSCISSORS);
		row.put(RoShamBo5.ROCK, vROCK);
	}

	public Outcome compete(RoShamBo5 it) {
		return table.get(this).get(it);
	}

	public static void main(String[] args) {
		RoShamBo.play(RoShamBo5.class, 20);
	}
} 

public class RoShamBo {
	public static <T extends Competitor<T>> void match(T a, T b) {
		System.out.println(a + " vs. " + b + ": " + a.compete(b));
	}

	public static <T extends Enum<T> & Competitor<T>> void play(
			Class<T> rsbClass, int size) {
		for (int i = 0; i < size; i++)
			match(Enums.random(rsbClass), Enums.random(rsbClass));
	}
}


关于JAVA中事件分发和监听机制实现的代码实例 关于JAVA中事件分发和监听机制实现的代码实例,绝对实用代码,有说明。 立即下载

相关推荐

简单动态分发器实现

在java web开发中,当前流行开发框架都是基于MVC架构的,其中分发器充当着中流砥柱的作用,它负责拦截所有指定的请求,并动态分发到指定的业务处理程序,同时,执行完成后,会将请求重新发送至客户端。本文是一种动态分发器的简易实现,通过java反射机制,将截获的请求的URL解析后,动态调用指定的处理类和方法

一、枚举类型——多路分发

多路分发

走在bug的路上 1万+

sophgo sdk v23.03.01

C/C++程序建议在x86主机上使用交叉编译工具链编译生成可执行文件后,再拷贝到SoC目标平台运行。# 创建docker用户组,若已有docker组会报错,没关系可忽略。对于SoC模式,模型转换也需要在docker开发容器中完成;docker开发容器的配置参照前述章节相关内容。6、创建docker容器并进入Docker。# docker命令免root权限执行。# 将当前用户加入docker组。# 重启docker服务。# 安装 docker。3、安装docker。7、SoC 环境配置。

weixin_40723768的博客 912

java controller统一封装路由

import com.hpb.bc.service.ApiFacadeService; import com.hpb.bc.util.RequestHandleUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autow...

Rachel_wang0123的博客 1614

手把手教你用AirSim和Unreal4在Ubuntu上创建自定义无人机仿真场景

本指南详细介绍了如何在Ubuntu系统上使用AirSim和Unreal Engine 4搭建高精度无人机仿真环境。从硬件配置、驱动安装到Unreal Engine编译和AirSim集成,手把手教你创建自定义场景,适用于算法验证和开发测试。

y7z8a的博客 255

如何让 RTX 5090 开启 PCIE P2P 以加速多卡通信

RTX 5090 基于新的 Blackwell 架构。NVIDIA 出于对某些主板兼容性(如 IOMMU、Resizable BAR 策略)的保守考虑,**屏蔽了 5090 的 BAR1 P2P 功能**。 我们需要通过 Patch 驱动源码,强制开启这一隐藏功能。 开启 P2P 后,PyTorch 的集合通信算子(Multi-GPU 训练的核心)延迟显著降低,**All-Reduce 甚至降低了 60% 以上**。

Hi20240217的博客 1711

Java:多线程实现任务分发

使用Java多线程实现这种任务分发的策略是:任务列表连续按线程数分段,先保证每线程平均能分配到的任务数,余下的任务从前至后依次附加到线程中--只是数量上,实际每个线程执行的任务都还是连续的。如果出现那种僧多(线程) 粥(任务) 少的情况,实际启动的线程数就等于任务数

一些平时在开发过程中遇到的常见问题,分享给大家 1115

LabVIEW状态机实战:用STM32+DHT11搭建温湿度监测系统(附完整VI源码)

本文详细介绍了如何利用LabVIEW状态机模式与STM32微控制器、DHT11温湿度传感器构建温湿度监测系统。通过硬件选型、状态机设计、LabVIEW程序实现及系统优化等环节,提供了一套完整的解决方案,并附有VI源码,助力开发者快速实现嵌入式温湿度监测应用。

weixin_42549723的博客 518

Java笔记-使用RabbitMQ的Java接口实现Fair dispatch(公平分发)

目录 基本概念 代码与实例 基本概念 当某些客户端处理比较强的时候,就多发数据让其处理,当某些客户端处理一般的时候,就少发数据让其处理。 主要是让消费者处理完后,回信息给RabbitMQ,然后RabbitMQ才会发送下一个。 使用basicQos(perfetch = 1) 注意:使用公平分发必须关闭自动应答ack改成手动。 代码与实例 程序运行截图如下:...

IT1995的博客 4857

C++ 类

本文介绍了C++中类的核心概念和使用方法。

weixin_54859557的博客 1016

基于CAT的VBM和SBM计算学习笔记(二)感兴趣区(ROI)&全脑体积(TIV)

本文介绍了用cat12运算VBM前,如何抓取ROI信息;运算VBM后,如何转化ROI文件和提取全脑体积,为之后的统计分析做好准备。t=N7T8基于CAT的VBM和SBM计算学习笔记(一)VBMhttps://mp.youkuaiyun.com/mp_blog/creation/editor/140665644。

Rose9614的博客 4356

java 多路分发_java实现多路分发

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

weixin_32552195的博客 375

基于gm/id方法的折叠式共源共栅放大器设计实践

本文详细介绍了基于gm/id设计方法进行折叠式共源共栅放大器设计的完整流程。该方法通过确定晶体管的跨导效率(gm/id)作为核心设计参数,将复杂的放大器设计转化为有明确路径的优化问题。文章以设计一个增益80dB、带宽1GHz的两级放大器为例,逐步拆解了从指标分解、关键晶体管工作点选取、到实战仿真与微调的全过程,特别强调了第二级设计对稳定性的影响以及相位裕度的调试技巧。

w8x9y0z1的博客 414

java基础总结 --- enum枚举实现多路分发 石头、剪刀、布游戏示例

多路分发: 当你处理多种交互类型时,程序可能会变得相当杂乱。举例来说,如果一个系统要分析 和执行数学表达式。我们可能会声明Number.plus(Number)、Number.mulitple(Number)等等, 其中Number是各种数字对象的超类。然而,当你声明a.plus(b)时,你并不知道a或者b的确切类型,那你如何能让它们正确交互呢? 你可能从未思考过这个问题的答案。Jav

zghwaicsdn的专栏 2692

【Docker】完美解决拉取镜像超时报错:ERROR: Get https://registry-1.docker.io/v2/

因为我们下载的镜像是外网的镜像资源,所以下载的速度会非常的慢,甚至大概率下载时会报错,所以需要我们配置一个国内的服务器镜像地址,国内服务器镜像地址有很多,这里咱们就说一下阿里镜像加速器的配置方法。

liu_chen_yang的博客 12万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用EnumMap实现多路分发(multiple dispatching):Thing In Java

EnumMap是一种特殊的Map,它要求其中的键(key)必须来自一个enum。由于enum本身的限制,所以EnumMap在内部可由数组实现。因此EnumMap的速度很快,我们可以放心地使用enum实例在EnumMap中进行查找操作。不过,我们只能将enum的实例作为键来调用put()方法,其他操作与使用一般的Map差不多。 下面的例子演示了命令设计模式的用法。一般来说,命令模式首先需要一个只有...

limeOracle的博客 265

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

多路分发

多路分发 何为多路分发: java仅仅持单路分发,即假设要运行的操作包括不止一个类型未知的对象时, 那么动态绑定机制仅仅能处理处中的一个类型, 假设须要处理两个类型,能够使用多路分发, 假设想使用两路分发,就必需要有两个方法调用: 第一个方法调用决定第一个未知类型, 第二个方法调用决定第二个未知类型 ...

weixin_30478619的博客 133

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: web简介
下一篇: java_第13章 多线程(1)
piperzero
博客等级 码龄21年 1377粉丝 504原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值