设计模式之代理模式

代理模式:为另一个对象提供一个替身或占位符以访问这个对象

代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。

远程代理管理客户和远程对象之间的交互,虚拟代理控制访问实例化开销大的对象,保护

代理基于调用者对象方法的访问,代理模式有许多变体,例如:缓存代理,同步代理,防

火墙代理和写入时复制代理。代理在结构上类似装饰者,但是目的不同,装饰者是为对象

加上行为,而代理则是控制访问。

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();  

    }

  }

}

原文地址:https://www.cnblogs.com/LvLoveYuForever/p/5803858.html