`
racingbird
  • 浏览: 23680 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

多路分发3

 
阅读更多

使用常量相关的方法

 

常量相关的方法允许我们为每个enum实例提供方法的不同实现,

这使得常量相关的方法似乎是实现多路分发的完美解决方案。

不过,通过这种方式,enum实例虽然可以具有不同的行为,

但他们任然不是类型,不能将其作为方法签名中的参数类型

来使用。最好的办法是将enum用在switch语句中

 

import static enumerated.Outcome.*;

public enum RoShamBo3 implements Competitor<RoShamBo3>{
	PAPER{
		public Outcome compete(RoShamBo3 it){
			switch(it){
			default:	// To placate the compiler
			case PAPER: return DRAW;
			case SCISSORS: return LOSE;
			case ROCK: return WIN;
			}
		}
	},
	SCISSORS{
		public Outcome compete(RoShamBo3 it){
			switch(it){
				default:
					case PAPER: return WIN;
					case SCISSORS: return DRAW;
					case ROCK: return LOSE;
			}
		}
	},
	ROCK{
		public Outcome compete(RoShamBo3 it){
			switch(it){
			default:
			case PAPER: return LOSE;
			case SCISSORS: return WIN;
			case ROCK: return DRAW;
			}
		}
	};
	
	public abstract Outcome compete(RoShamBo3 it);
	public static void main(String[] args){
		RoShamBo.play(RoShamBo3.class, 20);
	}
}

 

 

虽然这种方式可以工作, 却不合理, 如果采用RoShamBo解决方案, 在添加一个新

的类型时, 只需更少的代码, 而且更直接。


public enum RoShamBo4 implements Competitor<RoShamBo4>{
	ROCK{
		public Outcome compete(RoShamBo4 opponent){
			return compete(SCISSORS, opponent);
		}
	},
	SCISSORS{
		public Outcome compete(RoShamBo4 opponent){
			return compete(PAPER, opponent);
		}
	},
	PAPER{
		public Outcome compete(RoShamBo4 opponent){
			return compete(ROCK, opponent);
		}
	};
	
	Outcome compete(RoShamBo4 loser, RoShamBo4 opponent){
		return ((opponent == this) ? Outcome.DRAW
			: ((opponent == loser) ? Outcome.WIN
					: Outcome.LOSE));
	}
	
	public static void main(String[] args) {
		RoShamBo.play(RoShamBo4.class, 20);
	}
}

 

2个参数的compete()方法执行第二个分发,该方法执行一系列的比较,

行为类似switch语句。 这个版本的程序简单,却比较难理解。

对于一个大型系统,难以理解的代码将导致系统不够健壮。



使用EnumMap分发

import static enumerated.Outcome.*;
public 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);
	}
}
 

使用二维数组

还可以进一步简化实现两路分发的解决方案, 每个enum实例都有一个固定的值(基于声明的次序),

并且可以通过ordinal()方法取得该值。因此我们可以使用二维数组,将竞争者映射到

竞争的结果。 这种方式能够获得最简洁,最直接的解决方案

 

public enum RoShamBo6 implements Competitor<RoShamBo6>{
	PAPER, SCISSORS, ROCK;
	private static Outcome[][] tables = {
		{DRAW, LOSE, WIIN},	//PAPER
		{LOSE, WIN, DRAW},	//ROCK
		{WIN, DRAW, LOSE}, //SCISSOR
	};

	public Outcome compete(RoShamBo6 other){
		return table[this.ordinal()][other.ordinal()];
	}
	public static void main(String[] args){
		RoShamBo.play(RoShamBo6.class, 20);
	}
}
 

 

分享到:
评论

相关推荐

    rtsp多流分发 一分多输出

    RTSP多流分发的核心是将一个输入的RTSP流复制并分发到多个不同的输出流,使得多个客户端可以同时访问同一内容。这种技术在需要向大量用户实时推送相同内容的场景中非常实用,例如大型在线直播、视频会议或监控系统。...

    路由重分发资源路由重分发资源

    在有多个边界路由器的情况下,推荐使用单向重分发,避免回环和收敛问题,可以使用默认路由来限制外部路由的传播。而在单边界情况下,双向重分发可能是安全的,但需要配合路由过滤和调整管理距离来防止回环。 实验...

    OBS多路推流插件 OBS多开软件 推流

    在IT行业中,直播平台已经成为内容创作者与...通过多路推流插件,主播可以轻松地将内容分发到多个直播平台,而OBS多开则提供了灵活的场景管理和并发直播能力。对于想要优化直播体验的专业人士,掌握这些技能至关重要。

    多进程&多路复用并发的http服务器

    Nginx以其卓越的性能和稳定性在Web服务器市场占据一席之地,其核心特性之一就是其对多路复用并发的支持。 **多进程模型** 在多进程模型中,服务器启动时会创建多个子进程来处理客户端请求。每个子进程都是独立的,...

    C++多路视频传输

    最后,为了支持多路视频传输,系统可能还需要**流媒体服务器**来分发视频流。服务器可以缓存和管理多个并发的视频流,根据客户端的需求进行动态调度和分发。此外,使用**流媒体协议**如RTSP(Real-Time Streaming ...

    基于IPV4/IPV6的流媒体内容分发网络研究

    - 使用封装类实现网络通信模块的功能,包括`IPAddress`类处理套接字地址,异常处理类管理Socket异常,以及网络通信类提供TCP、多线程和多路复用等功能。 - 下载并集成IPv6支持补丁,主要包括`tpipv6.h`和`wspiapi....

    录制合成多路视频流

    3. 多路视频合成:多路视频合成是指将多个独立的视频流合并成一个单一的视频文件。在FFmpeg中,可以使用`-i`参数指定输入视频流,然后通过过滤器(如`hstack`或`vstack`)来实现水平或垂直堆叠,从而将多路视频合成...

    IOS多路并发

    3. **Block和Closure**:在多路并发中,Block是一种强大的工具,它可以封装代码块,并且可以作为参数传递。在GCD中,我们通常使用Block来定义并发任务。 4. **NSRunLoop**:它是iOS中的事件循环,用于处理系统事件...

    行业分类-设备装置-多路分解设备.zip

    这类设备通常应用于通信、监控、自动化等多个领域,其核心功能是将输入的多路信号进行分解、转换或者分发到不同的通道,以实现高效的数据处理和管理。 多路分解设备的设计原理往往基于数字信号处理技术,它能够接收...

    Go-gemux是一个足够好的多路复用器

    在IT行业中,多路复用器(Multiplexer)是一种用于高效管理网络连接的工具,它允许在一个单一的连接上处理多个并发请求。Go-gemux是针对Go语言环境设计的一个多路复用器,尤其适用于HTTP服务场景。下面将详细探讨这...

    git webhook接收分发工具

    在这个场景中,Golang的多路复用I/O(例如select、goroutine和channel)特性使得工具能够同时处理多个Webhook请求,实现高效且并发安全的监听和分发。 工具支持多个目录分发,这意味着你可以配置不同的目标路径,将...

    电子政务-多路控制电路.zip

    3. **数据分配器**:数据分配器可以将一个输入信号复制并分发到多个输出,这对于广播式的信息发布或数据同步非常有用。在电子政务系统中,这可能用于将公告、政策法规等信息推送给多个终端用户或部门。 4. **系统...

    live555通过VS2013编译,自己整理的,附加openRTSP项目

    《使用Live555在VS2013下编译及OpenRTSP实践》 Live555是一个开源的多媒体框架,广泛应用于实时流媒体协议的实现,如RTSP(Real-Time Streaming Protocol)、RTCP(Real-Time Transport Control Protocol)以及RTP...

    电子政务-多路电视调谐解调器.zip

    4. **多路复用与分发**:多路电视调谐解调器能够将不同频道的内容整合到一起,形成一个单一的传输流,便于通过光纤、同轴电缆或其他通信链路进行传输。同时,也可以根据需要将特定频道的内容分发给多个目的地。 5. ...

    通用FTP传输平台,支持多路传输

    1. **多路传输**:此平台支持多路传输,意味着可以同时处理多个文件或数据流的上传和下载,提高文件传输效率。这种特性对于大量数据交换或者需要快速响应的环境尤其重要,如大数据分析、媒体分发等。 2. **安全性**...

    行业分类-设备装置-多路并行传输宽带高速跳频通信方法及装置.zip

    5. **多路合并与分发**:在接收端,如何有效地合并来自多个并行信道的数据,保持数据的完整性和正确性。 文件名“多路并行传输宽带高速跳频通信方法及装置.pdf”可能包含详细的技术描述、原理图、实验结果以及具体...

    电子功用-多路分配器、源极驱动电路和显示器

    在电子工程领域,多路分配器、源极驱动电路和显示器是至关重要的组成部分,它们各自在电路设计中扮演着不同的角色。以下是对这些主题的详细解释: **多路分配器**,也称为多路开关或数据选择器,是一种数字集成电路...

    网络游戏-多星形网络上的管理和不管理的业务流的多路传输.zip

    多路传输是指在一个网络连接中同时传输多个数据流的能力,这通常通过多路复用技术实现,如TCP/IP协议栈中的TCP连接或UDP套接字。在网络游戏场景中,多路传输允许游戏服务器同时处理并发送多个玩家的动作、状态更新和...

    网络游戏-用于数据分发网络的性能优化的方法及装置.zip

    综上所述,网络游戏数据分发网络的性能优化涉及多个层面,包括缓存策略、CDN、负载均衡、协议优化、多路复用、预加载预测、边缘计算以及安全措施等。理解并应用这些技术,可以构建一个更加高效、稳定且用户友好的...

Global site tag (gtag.js) - Google Analytics