多路分发
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
对象的具体类型了。
发表评论
-
仿真[汽车制造]
2012-02-13 01:26 684class Car{ private final i ... -
线程例子[Condition, SignlAll, await]
2012-02-09 22:05 1031package concurrency.waxomati ... -
生产者消费者[简单示例]
2012-02-09 21:38 658class Meal{ private final ... -
泛型[创建类型实例]
2012-02-06 01:01 738public Class Erased<T> ... -
多路分发3
2012-02-05 23:16 828使用常量相关的方法 常量相关的方法允许我们为每个 ... -
多路分发2[使用enum分发]
2012-02-05 18:09 1902直接将RoShamBo1.java翻译为基于enum的版 ... -
使用Enum的自动贩卖机
2012-02-04 13:52 922public enum Input { NICKEL ... -
使用enum的责任链
2012-02-04 12:39 1178package enumerated; impor ... -
枚举类Enum,EnumSet,EnumMap
2012-02-04 02:00 1421EnumSet与HashSet相比,非常快。 p ... -
枚举类enum
2012-02-03 15:00 904一般来说,我们希望每个美剧实例能够返回对自身的描述, ... -
类的简化历[从内部类到匿名内部类]
2012-02-02 12:41 634Version1: public class DirL ... -
持有引用java.lang.ref 和 WeakHashMap
2012-02-02 01:27 981Thinking in java P554 持 ... -
Collections快速报错 fial-fast
2012-02-02 00:46 787{ public static void main( ... -
散列HashCode
2012-02-01 14:04 704散列的价值在于速度: 散列使得查询快速,由于瓶颈位于键 ... -
使用散列数据结构注意点
2012-02-01 01:32 590Goundhog自动继承基类Object,所以这里使用 ... -
Set注意点
2012-02-01 01:31 308如果我们尝试着将没有恰当支持不许的操作的类型用于需要这些 ... -
享元Map
2012-01-30 00:28 381这里之所以叫享元,注意static关键字。 定制了Entry ... -
深入容器Map
2012-01-19 15:12 398Map生成器 对Map的使用相同的方式,需要一 ... -
深入容器List
2012-01-19 14:40 342一种Generator解决方案: 所有Collect ... -
泛型数组
2012-01-19 00:57 637不能创建泛型数组,但能通过转型来赋予 public cl ...
相关推荐
RTSP多流分发的核心是将一个输入的RTSP流复制并分发到多个不同的输出流,使得多个客户端可以同时访问同一内容。这种技术在需要向大量用户实时推送相同内容的场景中非常实用,例如大型在线直播、视频会议或监控系统。...
本文档详细描述了实时传输协议(RTP),RTP 为实时数据传输例如交互的音频和视频提供了端到端传输...然而,RTP 还可以与其它适合的协议并用(参见第 11 章节),如果底层网络支持多路分发,RTP还可以提供数据给多路终点。
《使用Live555在VS2013下编译及OpenRTSP实践》 Live555是一个开源的多媒体框架,广泛应用于实时流媒体协议的实现,如RTSP(Real-Time Streaming Protocol)、RTCP(Real-Time Transport Control Protocol)以及RTP...
PIM-SM是一种组播路由协议,它建立了一种稀疏多路分发树(Sparse Mode Distribution Tree, SPT)和共享多路分发树(Shared Tree, RPT)。在RPT中,RP作为组播数据流的汇聚点,负责将流量分发到接收者。一个RP可以为...
在C#编程中,多播委托是委托...总结,多播委托是C#中的一种强大特性,它使得一个委托实例可以关联多个方法,实现了事件处理的多路分发。理解并熟练运用多播委托,能够帮助开发者更好地构建高效、灵活的事件驱动系统。
2. **分发流**:它可以将接收到的流转发到其他服务器或者直接推送给客户端,实现负载均衡和多路分发。 3. **存储流**:可以配置 Nginx 将直播流记录为 FLV 或 MP4 文件,便于后续点播。 4. **自定义逻辑**:通过 ...
数据缓存系统TUBE是一个分布式消息队列,具有线性扩展能力、数据持久化、高吞吐、多路分发和数据回溯特性。Storm集群则用于实时数据分拣,支持万级接口并发上传、容灾恢复和流量控制,基于流式计算平台,如Storm或...
在IT行业中,直播平台已经成为内容创作者与...通过多路推流插件,主播可以轻松地将内容分发到多个直播平台,而OBS多开则提供了灵活的场景管理和并发直播能力。对于想要优化直播体验的专业人士,掌握这些技能至关重要。
在有多个边界路由器的情况下,推荐使用单向重分发,避免回环和收敛问题,可以使用默认路由来限制外部路由的传播。而在单边界情况下,双向重分发可能是安全的,但需要配合路由过滤和调整管理距离来防止回环。 实验...
MediaConnect是一项实时流媒体传输服务,它使用户能够安全地将高质量的视频内容分发到多个目的地,比如直播活动或者复杂的多路分发工作流。 `mypy-boto3-mediaconnect`库的作用在于为Boto3的MediaConnect服务提供...
数据流经多路分发,一路向上级传输,确保各级管理层能够及时掌握设备运行状况。 系统的主要业务功能包括设备状态监控、故障报警、维护管理、装备供应保障信息管理、站网信息管理和站网运行能力评估。设备状态监控...
- **架构**:Postfix采用模块化设计,包括接收邮件的邮局守护进程(邮局代理,Mailbox Agent)、发送邮件的传输守护进程(传输代理,Transport Agent)和多路复用器(多路分发代理,Virtual Domain Controller)等...
5. **消息处理**:MFC内部调用`OnCmdMsg()`函数,这是一个多路分发函数,它可以处理命令消息(如菜单项点击,控件通知等),也可以处理标准Windows消息。如果消息映射表中有匹配项,相应的成员函数会被调用。 6. **...
4. **可连接性**:一个信号可以连接到多个槽,也可以将多个信号连接到同一个槽,实现事件的多路分发。 然而,使用信号和槽也存在一些潜在的缺点: 1. **效率**:虽然现代QT优化了信号和槽的性能,但相比于直接的...
此外,还有SDI-HDMI转换器用于不同接口间的适配,SDI分配器用于信号的多路分发,SDI矩阵用于信号路由切换,以及SDI光端机用于远距离传输。 总的来说,HD-SDI技术在安防监控领域的应用,不仅解决了传统模拟系统升级...
对于存储媒体,系统可以访问未来的帧来执行编码优化(如多遍编码或多路分发),或者实现高效的包调度策略,这些方法并不适用于实时直播视频。 #### 三、技术方案 ##### 3.1 感知质量指标 为了提高直播视频的质量...
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 信号...
36. **使用委托进行方法的多路分发**:一个委托可以调用多个方法,实现多任务处理。 37. **学习C#的版本兼容性**:理解不同.NET框架版本之间的差异,以便在项目中灵活选择。 38. **掌握异步编程的最佳实践**:如避免...
Nginx以其卓越的性能和稳定性在Web服务器市场占据一席之地,其核心特性之一就是其对多路复用并发的支持。 **多进程模型** 在多进程模型中,服务器启动时会创建多个子进程来处理客户端请求。每个子进程都是独立的,...
最后,为了支持多路视频传输,系统可能还需要**流媒体服务器**来分发视频流。服务器可以缓存和管理多个并发的视频流,根据客户端的需求进行动态调度和分发。此外,使用**流媒体协议**如RTSP(Real-Time Streaming ...