2010-03-07 53 views
1

我正尝试从Java使用Bonjour。我找到了一个如何去做的例子,我想我明白了。但我仍然不明白为什么它应该以这样复杂的方式来完成。可能是我想念什么。为什么它应该以如此复杂的方式完成?它是OOP的思维方式吗?

因此,code I found工作在以下方式(代码也在下面给出)。

  1. Java程序试图找到一个服务,如果服务被发现,程序试图“解决”的服务(我认为“以解决服务”是指“使用服务”或“连接到服务“)。

  2. 要“解析”找到的服务,我们需要调用“DNSSD.resolve”方法,并且作为此方法的最后一个参数,我们需要提供一个对象。

  3. “DNSSD.resolve”尝试解析给定的服务。如果“DNSSD.resolve”能够解析服务,它将调用作为最后一个参数给出的实例的“serviceResolved”方法。如果“DNSSD.resolve”无法解析服务,则ti调用上述对象的“operationFailed”方法。

下面是代码:

DNSSD.resolve(0, ifIndex, serviceName, regType, domain, new ResolveListener(){ 
       public void serviceResolved(DNSSDService resolver, int flags, int ifIndex, 
       String fullname, String hostname, int port, TXTRecord txtRecord){ 
        InetAddress theAddress; 
        try { 
         theAddress = InetAddress.getByName(hostname); 
        } catch (UnknownHostException e) { 
         // ouch.. 
        } 
       } 

       public void operationFailed(DNSSDService arg0, int arg1) { 
        // ouch, again! 
       } 
      }); 

难道不更简单的组织以下列方式中的代码。

  1. 我们使用关于要解析的服务的信息调用“DNSSD.resolve”方法。

  2. 我们不会将任何对象传递给“DNSSD.resolve”。

  3. “DNSSD.resolve”不调用任何类的任何方法。

  4. “DNSSD.resolve”尝试“解析”给定的服务,并且在能够这样做的情况下,“DNSSD.resolve”返回true。否则它返回false。

  5. 程序根据“DNSSD.resolve”返回的值运行“serviceResolved”或“operationFailed”方法。

或者我只是不习惯OOP的思维方式?

回答

4

与“异步思维方式”不同的是“OOP思维方式”。通过对可能需要一段时间的操作使用回调函数,您可以在等待操作完成时停止执行其他操作(或保持GUI响应)。

+0

但是在什么时候我会介绍这种“并行性”?在某个时候,程序调用DNSSD.resolve,我想,调用程序需要等到DNSSD解析服务。 – Roman 2010-03-07 17:16:25

+1

不,DNSSD.resolve()立即返回,即使分辨率尚未完成。你的程序可以回到它的主循环处理GUI事件或其他任何东西。当解析完成时,您的处理程序对象会在单独的线程中被调用,并且您可以对该线程中的结果进行一些处理,或者将消息排队回到GUI线程以显示结果等。 – Wyzard 2010-03-07 17:43:19

2

此外代码是Java-> JNI-> C代码。关于它没有任何OO。它是带有Java包装的异步程序代码。

+0

您如何看待它是“异步”?是什么让它“异步”? – Roman 2010-03-07 17:18:04

+0

您调用代码并告诉它在完成工作时要调用哪些函数,而不是等待结果同步。我已经看过这个Java封装器调用的Apple C代码。 – 2010-03-07 18:52:56

4

当然,有很多不同的方法来处理“问题”。这里采用的方法是回调方法:您调用resolve方法并将其传递给一个方法(呃,实际上是一个包含方法的对象,因为Java没有匿名方法或闭包等)。 一旦解析器已经(un-)成功解决了你想解决的任何问题,它会调用你给它的serviceResolved方法(然后它会根据解析器提供的信息做一些事情)。

这意味着它是一种异步方法,但不是面向对象。当解析器“工作”时,你可以做其他的事情,serviceResolved方法在时会被称为,所以你不需要等待。

+0

您如何看到“解决方案工作时我可以做其他事情”?我认为如果我调用一个方法,程序会加权直到方法完成任务,并且只有在程序执行完该方法后才执行代码。 – Roman 2010-03-07 17:24:33

+0

这样想:方法的工作并不是真正解决服务问题,它只是启动一个可以解决服务问题的线程。所以是的,您的程序必须等待该方法完成其任务,但不必等待服务得到解决。 – Wyzard 2010-03-07 17:46:21

0

JBonjourBrowser中,您可以看到其他人引用的“异步方法”是如何在JTree订户模型中使用的。笔者的注意,这“是特别有用...这里的设备往往是非常短暂和服务公布,消失不久之后。

0

回调界面风格通常用于异步操作。

当设计的界面特别是涉及网络或IO操作的服务,有两个问题经常出现: 1.是否同步(阻塞)或异步(非阻塞) 2.操作是否返回值

我们不能如果回调风格是面向对象的或者不是。 Object orie nted设计是为每个对象分配明确的责任。

相反,回调机制是面向异步操作的OO设计中非常常见的模式。 1.负责提供规定服务的服务 2.负责接收服务响应的回调

相关问题