メソッドをさまざまな実装に委任できる動的プロキシを作成したいと思います(メソッドの呼び出しごとに、潜在的に異なるオブジェクトが選択されます)。そして、あるプロキシメソッドが別のプロキシメソッドを呼び出すときのように、ポリモーフィック効果を実現したいのですが、オブジェクト選択メカニズムが再び適用されます。
さて、十分な混乱、ここに例があります:
interface IService {
void a();
void b();
}
class HappyService implements IService {
public void a() {
System.out.println("Happy a");
b();
}
public void b() {
System.out.println("Happy b");
}
}
class SadService implements IService {
public void a() {
System.out.println("Sad a");
b();
}
public void b() {
System.out.println("Sad b");
}
}
ここで、メソッドの呼び出しとメソッドの呼び出しIService
を常に選択するプロキシを作成したいと思います。最初に頭に浮かぶのは次のとおりです。HappyService
a()
SadService
b()
InvocationHandler h = new InvocationHandler() {
@Override
public Object invoke( final Object proxy, final Method method, final Object[] args ) throws Throwable {
Object impl;
if (method.getName().equals("a")) {
impl = new HappyService();
} else if (method.getName().equals("b")) {
impl = new SadService();
} else {
throw new IllegalArgumentException("Unsupported method: " + method.getName());
}
return method.invoke(impl, args);
}
};
IService service = (IService)Proxy.newProxyInstance( IService.class.getClassLoader(), new Class[]{ IService.class }, h );
service.a();
これは印刷します:
Happy a
Happy b
ええ、それは、b()
insideの呼び出しがa()
動的プロキシについて何も知らないためです。
それで、どうすれば私の目標を最もよく達成できますか?私の希望する出力は次のとおりです。
Happy a
Sad b
おそらくnew HappyService()
、呼び出しハンドラーの内部をさらに別のプロキシに置き換えることができます。このプロキシは、メソッドのみをに渡し、他のすべてのメソッドa()
をHappyService
元のプロキシにリダイレクトします。しかし、おそらくより良い/より簡単な解決策がありますか?