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

时间:2011-10-10 21:23:42

标签: 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 () {
        //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...);
    }
}

但这非常耗时,并且有很多重复的代码将每个方法移动到库中。有更好的方法吗?

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

3 个答案:

答案 0 :(得分:0)

定义一个接口:

interface library {
    method1();
    ...
    methodN();
}

然后使用动态代理反射性地调用服务实现的方法。您还必须找到有关如何选择应调用特定方法的服务的解决方案。但这不是很难。

你可以实现一个类:

class ServiceDemultiplexer implements InvocationHandler {

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

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

答案 1 :(得分:0)

更好的方法是避免这样做。

一个班级应该有一套明确的,尽可能一致的责任。如果所有这些类都存在,那肯定是因为每个类都有一组不同于其他类的责任。为什么不让调用者选择要使用的相应类,并从该类调用适当的方法。

您可以将Library类用作帮助程序类的工厂。呼叫者只需要做

library.getClass1().method1(...);

如果你说出真名,那就更自然了:

library.getProductManager().createProduct();

但即便如此,将特定依赖项注入调用者对象看起来比依赖像这样的大型工厂更好。使用依赖注入框架,如Spring或Guice。

答案 2 :(得分:0)

根据您正在处理的内容以及使用反射不是问题,您可以通过动态代理调用所有内容。

http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html

你的 InvocationHandler.invoke 只会找到在其参数中声明 Method m 的类和方法,实例化该类的对象(可以比这更快地完成)并且将呼叫传递给它。实际的实施取决于你已经拥有的东西。