设计模式之代理模式
代理模式:为另一个对象提供一个替身或占位符以访问这个对象
代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。
远程代理管理客户和远程对象之间的交互,虚拟代理控制访问实例化开销大的对象,保护
代理基于调用者对象方法的访问,代理模式有许多变体,例如:缓存代理,同步代理,防
火墙代理和写入时复制代理。代理在结构上类似装饰者,但是目的不同,装饰者是为对象
加上行为,而代理则是控制访问。
java内置的代理支持,可以根据需要建立动态代理,并将所有调用分配到所选的处理器。
就和其他的包装者(wrapper)一样,代理会造成你的设计中的类的数目增加。
举例:远程代理
远程接口:
import java.rmi.*;
public inteface MyRemote extends Remotes{
public String sayHello() throws RemoteException;//所有的远程方法都必须声明RemoteException
}
远程服务(实现)
import java.rmi.*;
import java.rmi.server.*;
public inteface MyRemoteImpl extends UnicastRemoteObject implements MyRemote{
public String sayHello() {
return "server says,'Hey' ";
}//不需要声明RemoteException
public MyRemoteImpl() throws RemoteException{}//超类UnicastRemoteObject构造器申明了异常,所以你必须写一个构造器
public static void main(String args[]){
try{
MyRemote service = new MyRemoteImpl();
Naming.rebind("RemoteHello",service);//先产生远程对象,再使用Naming.rebind()绑定到rmiregistry,客户将使用你所注册的名称在rmiregistry中寻找它
}catch(Exception ex){
ex.printStackTrace();
}
}
}
客户端代码:
import java.rmi.*;
public class MyRemoteClient{
public static void main(String args[]){
new MyRemoteClient().go();
}
public void go(){
try{
MyRemote service = (MyRemote) Naming.lookup(rmi://127.0.0.1/RemoteHello);
String s=service.sayHello();//看起来和一般的方式方法调用没有什么两样(除了必须注意RemoteException)
}catch(Exception ex){
ex.printStackTace();
}
}
}