有的时候程序要处理多种类型的交互,如果只使用单向的绑定支持,那么程序会变得相当复杂。比如,有A,B,C三种种类型互相比较,抽象出来的算法a.compete(b),可是a,b可以是A,B,C中的任意两种类型的互相比较,这就麻烦了。
java的动态绑定其实是一种单路分发,能动态确定a的类型,不能够动态绑定b的类型,传统的方法就是重载compete方法。代码繁琐,还有些丑。
多路分发是一种技巧,可以让代码优雅 :) ,用实现“锤子、剪刀、布”的程序为例子:
写道
import java.util.Random;
public class RoShamBo{
static Random rand = new Random(4);
public static void main(String[] args){
for(int i = 0; i < 10; i++){
Item a = nextItem();
Item b = nextItem();
System.out.println(a + " vs " + b + " : " + b.compete(a));
}
}
static Item nextItem(){
switch(rand.nextInt(3)){
default:
case 0: return new Rock();
case 1: return new Scissors();
case 2: return new Paper();
}
}
}
enum Result{
WIN, DRAW, LOSE;
}
interface Item{
Result compete(Item e);
Result eval(Paper p);
Result eval(Scissors s);
Result eval(Rock r);
}
class Rock implements Item{
@Override
public Result compete(Item e){
return e.eval(this);
}
@Override
public Result eval(Paper p){
return Result.LOSE;
}
@Override
public Result eval(Scissors s){
return Result.WIN;
}
@Override
public Result eval(Rock r){
return Result.DRAW;
}
@Override
public String toString(){
return "Rock";
}
}
class Scissors implements Item{
@Override
public Result compete(Item e){
return e.eval(this);
}
@Override
public Result eval(Paper p){
return Result.WIN;
}
@Override
public Result eval(Scissors s){
return Result.DRAW;
}
@Override
public Result eval(Rock r){
return Result.LOSE;
}
@Override
public String toString(){
return "Scissors";
}
}
class Paper implements Item{
@Override
public Result compete(Item e){
return e.eval(this);
}
@Override
public Result eval(Paper p){
return Result.DRAW;
}
@Override
public Result eval(Scissors s){
return Result.LOSE;
}
@Override
public Result eval(Rock r){
return Result.WIN;
}
@Override
public String toString(){
return "Paper";
}
}
public class RoShamBo{
static Random rand = new Random(4);
public static void main(String[] args){
for(int i = 0; i < 10; i++){
Item a = nextItem();
Item b = nextItem();
System.out.println(a + " vs " + b + " : " + b.compete(a));
}
}
static Item nextItem(){
switch(rand.nextInt(3)){
default:
case 0: return new Rock();
case 1: return new Scissors();
case 2: return new Paper();
}
}
}
enum Result{
WIN, DRAW, LOSE;
}
interface Item{
Result compete(Item e);
Result eval(Paper p);
Result eval(Scissors s);
Result eval(Rock r);
}
class Rock implements Item{
@Override
public Result compete(Item e){
return e.eval(this);
}
@Override
public Result eval(Paper p){
return Result.LOSE;
}
@Override
public Result eval(Scissors s){
return Result.WIN;
}
@Override
public Result eval(Rock r){
return Result.DRAW;
}
@Override
public String toString(){
return "Rock";
}
}
class Scissors implements Item{
@Override
public Result compete(Item e){
return e.eval(this);
}
@Override
public Result eval(Paper p){
return Result.WIN;
}
@Override
public Result eval(Scissors s){
return Result.DRAW;
}
@Override
public Result eval(Rock r){
return Result.LOSE;
}
@Override
public String toString(){
return "Scissors";
}
}
class Paper implements Item{
@Override
public Result compete(Item e){
return e.eval(this);
}
@Override
public Result eval(Paper p){
return Result.DRAW;
}
@Override
public Result eval(Scissors s){
return Result.LOSE;
}
@Override
public Result eval(Rock r){
return Result.WIN;
}
@Override
public String toString(){
return "Paper";
}
}
相关推荐
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 ...