Java 将模式代理(不同)方法到许多不同的类

Java 将模式代理(不同)方法到许多不同的类,java,oop,design-patterns,Java,Oop,Design Patterns,我有一堆类,它们有一组独特的方法 class1 { method1(dbconn, args...); method2(dbconn, args...); } class2 { method3(dbconn, args...); method4(dbconn, args...); } class3 { method5(dbconn, args...); } 我们需要通过平面库公开所有方法: class library { init () {

我有一堆类,它们有一组独特的方法

class1 {
    method1(dbconn, args...);
    method2(dbconn, args...);
}

class2 {
    method3(dbconn, args...);
    method4(dbconn, args...);
}

class3 {
    method5(dbconn, args...);
}
我们需要通过平面库公开所有方法:

class library {
    init () {
        //create instance of all helper classes
    }
    method1(args...) {
        return class1Instance.method1(getDbconn(), args...);
    }
    method2(args...) {
        return class1Instance.method2(getDbconn(), args...);
    }
    method3(args...) {
        return class2Instance.method3(getDbconn(), args...);
    }
    method4(args...) {
        return class2Instance.method4(getDbconn(), args...);
    }
    method5(args...) {
        return class3Instance.method5(getDbconn(), args...);
    }
}
但是它非常耗时,而且将每个方法移动到库中需要大量重复代码。有更好的方法吗

请注意,每个方法名称都是唯一的。参数和返回值的类型不同。

定义一个接口:

interface library {
    method1();
    ...
    methodN();
}
然后使用动态代理反射地调用服务实现的方法。您还必须找到一个解决方案,说明如何选择应该调用哪个服务特定方法。但这并不难

您可以实现一个类:

class ServiceDemultiplexer implements InvocationHandler {

     ServiceDemultiplexer(Object services[]) {
       ... 
     }

     public Object invoke(Object proxy, Method m, Object[] args)
    throws Throwable
     {
        ...
     }
}

最好的方法是避免这样做

一个类应该有一套定义良好、尽可能连贯的职责。如果所有这些类都存在,那肯定是因为每个类都有不同于其他类的职责。为什么不让调用者选择合适的类来使用,并从这个类中调用合适的方法呢

您可以将库类用作助手类的工厂。打电话的人只能这样做

library.getClass1().method1(...);
如果你给它起真名,它会变得更自然:

library.getProductManager().createProduct();

但即使如此,在我看来,将特定依赖注入调用方对象比依赖这样一个大型工厂要好。使用依赖项注入框架,如Spring或Guice。

根据您的工作内容,如果使用反射不是问题,您可以通过动态代理调用所有内容


您的InvocationHandler.invoke只需在其参数中定位类和方法并声明方法m,实例化该类的一个对象也可以在此之前完成,并将调用传递给它。实际的实现取决于您已经拥有的内容。

@nitet:我认为目标是创建一个门面模式。似乎期望为客户端提供一个统一的接口,而引擎盖下的实现将委托给适当的对象,例如class1或class2。是的,这也是我所理解的。“但拥有几个明确职责的门面总比拥有一个如此庞大的“一刀切”的门面要好。”吉布尼塞特表示同意。我也不想这样做。但是,该库由一个web服务使用,它的所有方法都以非常简单的格式列出。我们的要求是使web服务和库具有完全相同的界面。我认为您的界面是解决这个问题的最佳答案。谢谢然而,我有一半的想法写代码来自动生成库类-这将避免动态代理和解复用函数的性能损失。这个解决方案的优点是什么?