複雑なクラスがあり、ファサード クラスを実装して単純化したい (複雑なクラスを制御できないと仮定します)。私の問題は、複雑なクラスには多くのメソッドがあり、そのうちのいくつかを単純化し、残りはそのままにしておくことです。「単純化」の意味を以下に説明します。
メソッドがファサードで実装されている場合はそれを呼び出し、そうでない場合は複雑なクラスでメソッドを呼び出す方法を見つけたいと思います。私がこれを望んでいる理由は、より少ないコードを書くためです:) [少ないほど良い]
例:
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
}
しかし、このアプローチでは、すべての単純なメソッドを 1 つの委譲ステートメントだけで実装する必要があります。だから私はもっとコードを書く必要があります(それは簡単ですが)
オプション 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);
}