从单独的jar库中调用一个方法而不引用它

时间:2015-08-01 02:05:43

标签: java object design-patterns java-7 method-call

我正在用Java编写一个库。主应用程序引用库中的对象。

应用程序需要在其某个对象的某个点上调用方法。 库对象想要在应用程序中使用参数调用此方法。

想要将应用程序对象作为引用传递给库对象,因为我希望它松散耦合并且Application对象特定于该应用程序。如果我只是作为Object数据类型传递它,它将不会附加方法而不是没有强制转换的那种类型。

因为它们是独立的罐子,所以静态也不起作用,并希望它再次松散耦合。

示例

应用程序A正在运行并已观看课程。在它自己的罐子里。

public class WatchedInApplication extends BaseRichBolt { 
// has a reference to the lib class
private WatcherInLibrary lib;
...
  public void invoke (string.. args) {
    // invoke this method from another jar reference as a API.
    // to replay some data.
    outputCollector.emit(args)
  }    
}

库B由应用程序A引用,它想要在某个点调用应用程序A中的对象中的方法。这个库B也是另一个运行和监视应用程序A的jar。

public class WatcherInLibrary {
  public void invokeApplicationsinvokeMethod() {
     // invoke the applications method invoke, but with no specific      reference to it
    // basically want to invoke the output collector.emit to replay tuples.
  } 

}

我可以简单地将outputcollector或BaseRichBolt传递给库类B.但我想保持松散耦合。此外,两个应用程序都引用了Storm,这可能会导致未来的问题,即使没有问题,如果我开始传递outputcollector或BaseRichBolt,它也会与Storm紧密相关。

  • 是否存在聪明的设计模式? 简单的用户界面见下文

1 个答案:

答案 0 :(得分:0)

评论之后很简单。使用定义invoke(args)方法的接口。在Bolt对象上实现接口。然后可以传递它并且是通用的。然后从库方法调用。

快速玩具示例,可以通过界面上的泛型来改进。

WatchedApplication

public class WatchedInApplication implements Invoke {

  private WatcherInLibrary lib;

  public WatchedInApplication(WatcherInLibrary lib) {
    super();
    this.setLib(lib);
  }

  public WatcherInLibrary getLib() {
    return lib;
  }

  public void setLib(WatcherInLibrary lib) {
    this.lib = lib;
  }
  // where the method is implemented. 
  @Override
  public void invokeRemote(String data) {
    System.out.println("Method Invoked " + data.toString());
  }
}

WatcherLibrary

public class WatcherInLibrary {

  private Invoke obj;

  public void setWatchedApplication(Invoke object) {
    this.obj = object;
  }

  public void invokeRemoteObject() {
    this.obj.invokeRemote("data passed");
  }

}

界面解决方案

public interface Invoke {
  public void invokeRemote(String data);
}

主要示例

WatcherInLibrary lib = new WatcherInLibrary();
WatchedInApplication watched = new WatchedInApplication(lib);
lib.setWatchedApplication(watched);
lib.invokeRemoteObject();

使用该接口可使此解决方案适用于任何数据类型。