шаблон для прокси (разные) методы для разных классов - PullRequest
0 голосов
/ 11 октября 2011

У меня есть связка классов с уникальным набором методов.

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 голосов
/ 11 октября 2011

Лучший способ сделать это, чтобы избежать этого.

Класс должен иметь четко определенный, как можно более последовательный, набор обязанностей.Если все эти классы существуют, это, безусловно, потому, что каждый из них имеет другой набор обязанностей, чем другие.Почему бы вам не позволить вызывающей стороне выбрать подходящий класс для использования и вызвать соответствующий метод из этого класса.

Вы можете использовать свой класс Library в качестве фабрики вспомогательных классов.Вызывающие абоненты должны были бы просто сделать

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

Если вы введете настоящие имена, это станет более естественным:

library.getProductManager().createProduct();

Но даже в этом случае добавление определенных зависимостей в объект вызывающей стороны выглядит лучшедля меня, чем полагаться на такую ​​огромную фабрику.Используйте инфраструктуру внедрения зависимостей, такую ​​как Spring или Guice.

0 голосов
/ 11 октября 2011

В зависимости от того, над чем вы работаете, и если использование отражения не является проблемой, вы можете вызывать все через динамический прокси.

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

Your InvocationHandler.invoke просто найдет класс и метод, объявляющий Метод m в своем параметре, создаст экземпляр объекта этого класса (это можно сделать и раньше) и передаст ему вызов.Реальная реализация зависит от того, что у вас уже есть.

0 голосов
/ 11 октября 2011

определить интерфейс:

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

затем используйте динамический прокси для рефлексивного вызова методов ваших реализаций сервиса. Вам также нужно будет найти решение о том, как выбрать, какую службу следует вызывать для конкретного метода. но это не очень сложно.

Вы можете реализовать класс:

class ServiceDemultiplexer implements InvocationHandler {

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

     public Object invoke(Object proxy, Method m, Object[] args)
    throws Throwable
     {
        ...
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...