多路分发
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 678class Car{ private final i ... -
线程例子[Condition, SignlAll, await]
2012-02-09 22:05 1018package concurrency.waxomati ... -
生产者消费者[简单示例]
2012-02-09 21:38 651class Meal{ private final ... -
泛型[创建类型实例]
2012-02-06 01:01 727public Class Erased<T> ... -
多路分发3
2012-02-05 23:16 811使用常量相关的方法 常量相关的方法允许我们为每个 ... -
多路分发2[使用enum分发]
2012-02-05 18:09 1893直接将RoShamBo1.java翻译为基于enum的版 ... -
使用Enum的自动贩卖机
2012-02-04 13:52 908public enum Input { NICKEL ... -
使用enum的责任链
2012-02-04 12:39 1167package enumerated; impor ... -
枚举类Enum,EnumSet,EnumMap
2012-02-04 02:00 1406EnumSet与HashSet相比,非常快。 p ... -
枚举类enum
2012-02-03 15:00 895一般来说,我们希望每个美剧实例能够返回对自身的描述, ... -
类的简化历[从内部类到匿名内部类]
2012-02-02 12:41 626Version1: public class DirL ... -
持有引用java.lang.ref 和 WeakHashMap
2012-02-02 01:27 972Thinking in java P554 持 ... -
Collections快速报错 fial-fast
2012-02-02 00:46 774{ public static void main( ... -
散列HashCode
2012-02-01 14:04 693散列的价值在于速度: 散列使得查询快速,由于瓶颈位于键 ... -
使用散列数据结构注意点
2012-02-01 01:32 581Goundhog自动继承基类Object,所以这里使用 ... -
Set注意点
2012-02-01 01:31 294如果我们尝试着将没有恰当支持不许的操作的类型用于需要这些 ... -
享元Map
2012-01-30 00:28 374这里之所以叫享元,注意static关键字。 定制了Entry ... -
深入容器Map
2012-01-19 15:12 391Map生成器 对Map的使用相同的方式,需要一 ... -
深入容器List
2012-01-19 14:40 339一种Generator解决方案: 所有Collect ... -
泛型数组
2012-01-19 00:57 632不能创建泛型数组,但能通过转型来赋予 public cl ...
相关推荐
RTSP多流分发的核心是将一个输入的RTSP流复制并分发到多个不同的输出流,使得多个客户端可以同时访问同一内容。这种技术在需要向大量用户实时推送相同内容的场景中非常实用,例如大型在线直播、视频会议或监控系统。...
就是非阻塞IO 采用多路分发方式 举个例子吧 你服务器做一个聊天室 按照以前的阻塞式IO 你必须为每个连接创建一个线程 因为当你调用如 in read buf 时 线程会阻塞在这里 而采用nio 只要注册了事件 它内部采用反应模式...
本文档详细描述了实时传输协议(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)等...
4. **可连接性**:一个信号可以连接到多个槽,也可以将多个信号连接到同一个槽,实现事件的多路分发。 然而,使用信号和槽也存在一些潜在的缺点: 1. **效率**:虽然现代QT优化了信号和槽的性能,但相比于直接的...
当用户与屏幕交互时,会产生触摸事件(MotionEvent),这些事件会沿着View层次结构进行传递,这个过程就叫做事件分发。Android事件分发机制主要分为三个步骤:dispatchTouchEvent(), onInterceptTouchEvent() 和 ...
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 ...
在IT行业中,录制和合成多路视频流是一项关键的技术,特别是在视频监控、直播和多媒体应用等领域。本项目涉及的核心技术包括FFmpeg库的使用、视频采集、多路视频的合成以及TS流的传输。以下是对这些知识点的详细阐述...
phper 请了解进程调度策略,CPU 时间片,进程控制【创建,...撸过 tcp 的话应该知道要能处理多个客户端,就得用 IO 复用技术【事件多路分发器】或是多进程以及多线程,每来一个客户端就 fork 一个进程或是线程,那样的