我有一个关于公开异步远程接口(interface)的最佳方式的问题。
条件如下:
- 协议(protocol)是异步的
- 第三方可以随时修改数据
- 命令往返可能很重要
- 模型应该非常适合 UI 交互
- 协议(protocol)支持对特定对象的查询,模型也必须如此
作为提高我在这方面缺乏技能的一种方式(并总体上复习我的 Java),我已经开始了 project为 xmms2 创建基于 Eclipse 的前端(如下所述)。
所以,问题是;我应该如何将远程接口(interface)公开为一个简洁的数据模型(在本例中,跟踪管理和事件处理)?
我欢迎任何从一般性讨论到模式名称删除或具体示例和补丁的讨论:)
我在这里的主要目标是总体上了解这类问题。如果我的项目可以从中获益,那很好,但我严格地展示它是为了有一些东西可以开始讨论。
我实现了一个协议(protocol)抽象,我称之为 'client' (出于遗留原因)它允许我使用方法调用访问大多数公开的功能,即使它远非完美,我也很满意。
xmms2 守护程序提供的功能包括轨道搜索、元数据检索和操作、更改播放状态、加载播放列表等等。
我正在更新到 xmms2 的最新稳定版本,我想我还不如修复我当前实现的一些明显弱点。
我的计划是在协议(protocol)接口(interface)之上构建一个更好的抽象,允许与守护进程进行更自然的交互。当前'model'实现很难使用,而且坦率地说非常丑陋(更不用说 UI 代码了,这真是太糟糕了 atm)。
今天我有 Tracks我可以用来获取 Track 实例的接口(interface)基于他们的id的类。通过 Collections 执行搜索接口(interface)(不幸的 namespace 冲突),我想我宁愿移动到 Tracks。
任何数据都可以随时被第三方修改,这应该适本地反射(reflect)在模型和分发的更改通知中
这些接口(interface)在连接时通过返回如下所示的对象层次结构公开:
- 连接
- 回放 getPlayback()
- 播放、暂停、跳转、当前轨道等
- 公开播放状态变化
- 轨道 getTracks()
- 跟踪 getTrack(id) 等
- 公开轨道更新
- 集合 getCollection()
- 加载和操作播放列表或命名集合
- 查询媒体库
- 公开集合更新
- 回放 getPlayback()
最佳答案
对于异步位,我建议查看 java.util.concurrent
,尤其是 Future<T>
界面。 Future 接口(interface)用于表示尚未准备好但正在单独线程中创建的对象。你说第三方可以随时修改对象,但我仍然建议你在这里使用不可变的返回对象,而是有一个单独的线程/事件日志,你可以订阅以在对象过期时得到通知。我很少使用 UI 进行编程,但我相信使用 Futures 进行异步调用会让您拥有响应式 GUI,而不是等待服务器回复的 GUI。
对于查询,我建议使用方法链来构建查询对象,方法链返回的每个对象应该是Iterable
。 .类似于 Djangos 模型的方式。假设你有 QuerySet
实现Iterable<Song>
.然后您可以调用 allSongs()
这将返回迭代所有歌曲的结果。或者 allSongs().artist("Beatles")
,并且您将对所有 Betles 歌曲进行迭代。甚至 allSongs().artist("Beatles").years(1965,1967)
等等。
希望这有助于作为一个起点。
关于java - 公开远程接口(interface)或对象模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37041/