设计模式2+ 代理模式的其他应用方式

一. 远程代理(控制远程服务和客户之间的交互)

第一步:制作远程接口(定义让客户对象可以进行远程调用的方法)

1.扩展java.rmi.Remote(表明此接口用来支持远程调用)
2.声明所有的方法都会抛出RemoteException异常(客户调用stub上的方法,用到了io和网络,很容易发生异常)
3.确定变量和返回值是可序列化类型(远程方法的变量和返回值被打包通过网络传送,需要网络来实现)

第二步:制作远程的实现(就是服务对象实现远程接口,实现远程方法)

1.实现远程接口(客户调用接口中的方法)
2.扩展UnicastRemoteObject(远程服务对象需要某些远程的功能通过这个类来实现)
3.设计一个不带变量的构造器,声明RemoteException(扩展的类的构造器抛出RemoteException)
4.用RMI Registry注册此服务(通过java.rmi.Nameing的rebind方法注册,实际上注册的是客户真正需要的stub(客户辅助对象))

第三步:客户对象找到客户辅助对象(stub)

通过java.rmi.Nameing.lookup方法找到注册表中的服务代理对象。

第四步:开始远程服务

代理对象调用服务真正的方法。

服务器端完整代码:

远程接口:
	public interface MyRemote extends Remote{
	public String sayHello(String name)  throws RemoteException;
}

远程服务(远程接口实现):
pubic class MyRemoteImpl extends UniCastRemoteObject implements MyRemote{
	public MyRemoteImpl() throws RemoteException{}
	public String sayHello(String name)throws RemoteException{
		return "Hello "+name+"!";
	}

	//注册此服务
	public static void main(String[] args){
		try{
			MyRemote service=new MyRemoteImpl();
			Naming.rebind("RemoteHello",service);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

客户端完整代码:

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();
			System.out.print(s);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	IntHelloRmi helloRmi;
	public void client() throws RemoteException,MalformedURLException,NotBoundException{
		helloRmi=(IntHelloRmi)Naming.lookup("rmi://localhost:9999/HelloRmi");
		System.out.Println("client:");
		System.out.Println(helloRmi.helloRmi());
		System.out.Println(helloRmi.sayHello("rmi"));
	}
}

2.远程代理底层实现过程

第一步:客户对象调用客户辅助对象的do方法;
第二步:客户辅助对象打包调用信息(方法名,参数),通过网络发送给服务辅助对象;
第三步:服务辅助对象解包,调用真正的服务对象的真正方法;
第四步:执行服务对象的真正方法,将返回值给服务辅助对象;
第五步:服务辅助对象将结果打包,发送给客户辅助对象;
第六步:客户辅助对象解包,将结果给客户对象。

二.虚拟代理(控制访问实例化开销大的对象)

虚拟代理作为创建开销大的对象的代表;
虚拟代理经常直到我们真正需要一个对象时才去创建他;
对象创建前和创建中,虚拟代理来扮演对象的替身;
对象创建后,代理就会把请求委托给对象。

三.保护代理(基于调用者控制对对象方法的访问)

一种根据访问权限决定客户可否访问对象的代理,通过设置多个代理类来实现。
例如:可用jdk动态代理来实现:设置多个调用处理器,根据权限的不同,执行不同的方法。

。。。。。。

代理模式结构类似于装饰者模式,但是代理模式控制访问,装饰者模式是为对象加上行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值