我正在用Java编写一个小型聊天程序。我得到了一些类,其对象必须跟踪彼此(例如,当新消息进入时,连接侦听器需要更新GUI,就像GUI需要写入连接的编写器,当用户想要发送消息时)。
在Mac OS X的Cocoa中,我写了&实现委托模型。用Java怎么样? (到目前为止,我只是在初始化一个新对象时将'this'作为参数传递,以便从新对象继续引用它。)
答案 0 :(得分:3)
在Cocoa / Objective-C中,委托是遵循指定协议的对象。 Java接口类似于Objective-C协议,但Java不允许使用可选方法:如果您的类实现了接口,则必须实现所有方法。
如果您对所需的所有委托方法感到满意,只需定义一个界面并使用它。
如果您的委托接口有很多方法,并且可以方便地使其中一些方法可选,那么您可以定义一个实现委托接口的Adapter类,为每个方法提供默认实现。要使用它,您的委托类必须扩展适配器类,或者,如果不可能,则定义扩展适配器类的私有内部类。 (查看Java的MouseListener接口和MouseAdapter类以获取此示例。)
总之,您仍然可以在Java中使用委托模式,尽管静态类型检查会使可选方法更加有效。
答案 1 :(得分:0)
代表不是由Java语言直接提供的;使用侦听器模式是标准Java与委托人最接近的模式。
但是,我已经使用反射在Java中实现了回调/委托支持。详细信息和工作来源为available on my website。
如何运作
我们有一个名为Callback的原则类,它有一个名为WithParms的嵌套类。需要回调的API将Callback对象作为参数,如果需要,创建一个Callback.WithParms作为方法变量。由于此对象的大量应用程序将是递归的,因此非常干净。
由于性能仍然是我的首要任务,我不希望被要求创建一个一次性对象数组来保存每个调用的参数 - 毕竟在大型数据结构中可能有数千个元素,并且在消息处理场景中,我们最终可能会在一秒钟内处理数千个数据结构。
为了成为线程安全,参数数组需要为API方法的每次调用唯一存在,为了提高效率,每次调用回调都应使用相同的参数;我需要第二个对象,它可以很便宜地创建,以便将回调与参数数组绑定以进行调用。但是,在某些情况下,由于其他原因,调用者已经拥有了参数数组。由于这两个原因,参数数组不属于Callback对象。此外,调用的选择(将参数作为数组或单个对象传递)属于API的手中,使用回调使其能够使用最适合其内部工作的调用。
然后,WithParms嵌套类是可选的,有两个用途,它包含回调调用所需的参数对象数组,它提供10个重载的invoke()方法(带有1到10个参数),用于加载参数然后调用数组然后调用回调目标。