У меня есть сложный класс, и я хочу упростить его, реализуя фасадный класс (предположим, что у меня нет контроля над сложным классом). Моя проблема в том, что сложный класс имеет много методов, и я просто упрощу некоторые из них, а остальные останутся такими, какие они есть. Что я подразумеваю под «упрощением», объясняется ниже.
Я хочу найти способ, чтобы, если метод реализован с фасадом, вызвать его, а если нет, то вызвать метод в сложном классе. Причина, по которой я хочу этого, заключается в том, чтобы писать меньше кода :) [меньше значит больше]
Пример:
Facade facade = // initialize
facade.simplified(); // defined in Facade class so call it
// not defined in Facade but exists in the complex class
// so call the one in the complex class
facade.alreadySimple();
Варианты, которые приходят на ум, следующие:
Вариант 1. Напишите класс, содержащий переменную сложного класса, и реализуйте сложные, а затем реализуйте простые с прямым делегированием:
class Facade {
private PowerfulButComplexClass realWorker = // initialize
public void simplified() {
// do stuff
}
public void alreadySimple() {
realWorker.alreadySimple();
}
// more stuff
}
Но при таком подходе мне нужно будет реализовать все простые методы всего одним оператором делегирования. Поэтому мне нужно написать больше кода (хотя это просто)
Вариант 2. Расширить сложный класс и реализовать упрощенные методы, но тогда будут видны как простые, так и сложные версии этих методов.
В python я могу добиться подобного поведения:
class PowerfulButComplexClass(object):
def alreadySimple(self):
# really simple
# some very complex methods
class Facade(object):
def __init__(self):
self.realworker = PowerfulButComplexClass()
def simplified(self):
# simplified version of complex methods in PowerfulButComplexClass
def __getattribute__(self, key):
"""For rest of the PowerfulButComplexClass' methods use them as they are
because they are simple enough.
"""
try:
# return simplified version if we did
attr = object.__getattribute__(self, key)
except AttributeError:
# return PowerfulButComplexClass' version because it is already simple
attr = object.__getattribute__(self.data, key)
return attr
obj = Facace()
obj.simplified() # call the one we have defined
obj.alreadySimple( # call the one defined in PowerfulButComplexClass
Так как же это сделать с помощью Java?
Изменить: что я имею в виду под «упрощением»: сложный метод может быть либо методом со слишком большим количеством аргументов
void complex method(arg1, arg2, ..., argn) // n is sufficiently large
или набор связанных методов, которые почти всегда будут вызываться вместе для достижения одной задачи.
outArg1 = someMethod(arg1, arg2);
outArg2 = someOtherMethod(outArg1, arg3);
actualResult = someAnotherMethod(outArg2);
поэтому мы хотим иметь что-то вроде этого:
String simplified(arg1, arg2, arg3) {
outArg1 = someMethod(arg1, arg2);
outArg2 = someOtherMethod(outArg1, arg3);
return someAnotherMethod(outArg2);
}