代理模式
代理要做的就是控制和管理访问。
你的客户对象所做的就像是在做远程方法调用,但其实只是调用本地堆中的“代理”对象上的方法,再由代理处理所有网络通信的低层细节。
Java的RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法。RMI的好处在于你不必亲自写任何网络或I/O代码。客户程序调用远程方法(即真正的服务所在)就和在运行在客户自己的本地JVM上对对象进行正常方法调用一样。
RMI将客户辅助对象称为stub(桩),服务辅助对象成为skeleton(骨架)。
定义代理模式
代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。
public class NonOwnerInvocationHandler implements InvocationHandler {
PersionBean person;
public NonOwnerInvocationHandler(PersionBean person) {
this.person = person;
}
public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {
try{
if(method.getName().startsWith("get")){
return method.invoke(person, args);
} else if(method.getName().equals("setHotOrNotRating")){
return method.invoke(person, args);
} else if(method.getName().startsWith("set")) {
return IllegalAccessException();
}
} catch(InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
}
PersionBean getNonOwnerProxy(PersionBean person) {
return (PersionBean) Proxy.newProxyInstance(
person.getClass().getClassLoader(),
person.getClass().getInterfaces(),
new NonOwnerInvocationHandler(person));
}
真实世界中还有很多代理:
12 复合模式(模式的模式)
模式通常被一起使用,并被组合在同一个设计解决方案中。复合模式在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题。
…