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

多路分发

 
阅读更多

 多路分发

 

Number.plus(Number)

 

Number是各种数字对象的超类。 当声明a.plus(b)时,并不知道a,b的确切类型。

如何正确地交互?

Java只支持单路分发,如果要执行的操作包含了不止一个类型未知的对象时,

那么Java的动态绑定机制只能处理其中一个的类型。所以必须自己来判定其他的

类型,从而实现自己的动态绑定行为。

 

解决的办法就是多路分发,如果想使用2路分发,那么必须有2个方法调用,

第一个方法调用决定第一个未知类型,第二个方法调用决定第二个未知类型。

所以必须为每一个类型提供给一个实际的方法调用

 

一般而言,需要有设定好的某种配置,以便一个方法调用能够引出更多的方法

调用,从而能够在这个过程中处理多种类型。

 

为了达到这种效果,我们需要与多个方法一同工作: 因为每个分发都需要一个

方法调用。

 

下面剪刀 石头 布 游戏对应的方法是compete()和eval(),二者都是同一个类型

的成员, 可以产生三种Outcome实例中的一个作为结果。



public enum Outcome {
		WIN, LOSE, DRAW
	}

	import java.util.Random;
import static enumerated.Outcome.*;


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 RoShamBol {
	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());
	}
}
 
 Item是这几种类型的接口, 用作多路分发。 RoshamBol.match()有2个item参数,
 通关过Item.compete()方法开始2路分发,要判定a的类型,分发机制会在a的实际
 类型的compete()内部起到分发作用。compete()方法通关过eval()来为另一个类型
 实现第二次分发, 将自身(this)作为参数调用eval(),能够调用重载过的eval()
 方法,这能够保留第一次分发的类型信息,第二次分发完成时,就能知道两个Item
 对象的具体类型了。
分享到:
评论

相关推荐

    rtsp多流分发 一分多输出

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

    RFC-3550-RTP协议-中文版.pdf

    本文档详细描述了实时传输协议(RTP),RTP 为实时数据传输例如交互的音频和视频提供了端到端传输...然而,RTP 还可以与其它适合的协议并用(参见第 11 章节),如果底层网络支持多路分发,RTP还可以提供数据给多路终点。

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

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

    HCNP Routing&amp;Switching之组播技术PIM-SM RP.doc

    PIM-SM是一种组播路由协议,它建立了一种稀疏多路分发树(Sparse Mode Distribution Tree, SPT)和共享多路分发树(Shared Tree, RPT)。在RPT中,RP作为组播数据流的汇聚点,负责将流量分发到接收者。一个RP可以为...

    用c#实现多播委托的应用

    在C#编程中,多播委托是委托...总结,多播委托是C#中的一种强大特性,它使得一个委托实例可以关联多个方法,实现了事件处理的多路分发。理解并熟练运用多播委托,能够帮助开发者更好地构建高效、灵活的事件驱动系统。

    nginx-1.7.11.3-Gryphon_niginxrtmp_gryphon_

    2. **分发流**:它可以将接收到的流转发到其他服务器或者直接推送给客户端,实现负载均衡和多路分发。 3. **存储流**:可以配置 Nginx 将直播流记录为 FLV 或 MP4 文件,便于后续点播。 4. **自定义逻辑**:通过 ...

    基于SQL的实时应用开发实践.pptx

    数据缓存系统TUBE是一个分布式消息队列,具有线性扩展能力、数据持久化、高吞吐、多路分发和数据回溯特性。Storm集群则用于实时数据分拣,支持万级接口并发上传、容灾恢复和流量控制,基于流式计算平台,如Storm或...

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

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

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

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

    PyPI 官网下载 | mypy-boto3-mediaconnect-1.18.4.tar.gz

    MediaConnect是一项实时流媒体传输服务,它使用户能够安全地将高质量的视频内容分发到多个目的地,比如直播活动或者复杂的多路分发工作流。 `mypy-boto3-mediaconnect`库的作用在于为Boto3的MediaConnect服务提供...

    基于Android的移动气象探测设备运行监控系统设计与实现.pdf

    数据流经多路分发,一路向上级传输,确保各级管理层能够及时掌握设备运行状况。 系统的主要业务功能包括设备状态监控、故障报警、维护管理、装备供应保障信息管理、站网信息管理和站网运行能力评估。设备状态监控...

    postfix-2.8.0加补丁

    - **架构**:Postfix采用模块化设计,包括接收邮件的邮局守护进程(邮局代理,Mailbox Agent)、发送邮件的传输守护进程(传输代理,Transport Agent)和多路复用器(多路分发代理,Virtual Domain Controller)等...

    MFC消息响应机制 面向对象 消息映射 MFC 程序设计

    5. **消息处理**:MFC内部调用`OnCmdMsg()`函数,这是一个多路分发函数,它可以处理命令消息(如菜单项点击,控件通知等),也可以处理标准Windows消息。如果消息映射表中有匹配项,相应的成员函数会被调用。 6. **...

    qt信号和槽的简单介绍

    4. **可连接性**:一个信号可以连接到多个槽,也可以将多个信号连接到同一个槽,实现事件的多路分发。 然而,使用信号和槽也存在一些潜在的缺点: 1. **效率**:虽然现代QT优化了信号和槽的性能,但相比于直接的...

    HD-SDI.doc

    此外,还有SDI-HDMI转换器用于不同接口间的适配,SDI分配器用于信号的多路分发,SDI矩阵用于信号路由切换,以及SDI光端机用于远距离传输。 总的来说,HD-SDI技术在安防监控领域的应用,不仅解决了传统模拟系统升级...

    流媒体资料

    对于存储媒体,系统可以访问未来的帧来执行编码优化(如多遍编码或多路分发),或者实现高效的包调度策略,这些方法并不适用于实时直播视频。 #### 三、技术方案 ##### 3.1 感知质量指标 为了提高直播视频的质量...

    Linux高性能服务器编程

    12.2.5 往事件多路分发器中注册事件 12.2.6 eventop结构体 12.2.7 event_base结构体 12.2.8 事件循环 第13章 多进程编程 13.1 fork系统调用 13.2 exec系列系统调用 13.3 处理僵尸进程 13.4 管道 13.5 信号...

    提高C#编程水平的50个要点

    36. **使用委托进行方法的多路分发**:一个委托可以调用多个方法,实现多任务处理。 37. **学习C#的版本兼容性**:理解不同.NET框架版本之间的差异,以便在项目中灵活选择。 38. **掌握异步编程的最佳实践**:如避免...

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

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

    C++多路视频传输

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

Global site tag (gtag.js) - Google Analytics