我想创建一个动态代理,它可以将其方法委托给不同的实现(每个方法调用选择一个可能不同的对象)。而且我想实现多态的效果,比如当某个代理方法调用另一个代理方法时,对象选择机制确实再次适用。
好的,足够的混乱,这是一个例子:
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 ofa()
对动态代理一无所知。
那么,我怎样才能最好地实现我的目标呢?我想要的输出是:
Happy a
Sad b
我可能会用new HappyService()
另一个代理替换调用处理程序内部的我,它只将方法传递a()
给HappyService
,并将所有其他方法重定向回原始代理。但也许有更好/更简单的解决方案?