`

设计模式回顾之八:代理模式(Proxy)

 
阅读更多

设计模式回顾系列文章: 主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。

------------------------------------------------ 

代理模式:

为其它对象提供一种代理以控制对这个对象的访问。

在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象,这些额外的操作通常需要与实际对象进行通信。

 

程序实现:

抽象类,提供代理对象和真实对象的共用接口,使得任何使用真实对象的地方都能使用代理对象:

public abstract class Subject {
	public abstract void request();
}

真实对象,继承抽象类:

public class RealSubject extends Subject{
	@Override
	public void request() {
		System.out.println("handle real subject request...");
	}
}

代理对象,同样继承抽象类:

public class Proxy extends Subject{
	private RealSubject realSubject;
	
	public Proxy(RealSubject real){
		this.realSubject=real;
	}
	@Override
	public void request() {
		if(realSubject==null){
			realSubject=new RealSubject();
		}
		System.out.println("before real subject request.");//请求前处理逻辑.
		realSubject.request();
		System.out.println("after real subject request.");//请求后处理逻辑.
	}
}

程序入口:

public static void main(String[] args) {
		Proxy proxy=new Proxy(new RealSubject());
		proxy.request();
}

 

举例:权限代理(权限访问控制)、远程访问代理等。

 

关于Java动态代理:

代理类程序运行前并不存在,需要在程序运行时动态生成(无需手工编写代理类源码),那就是动态代理了。

代理类程序的生成使用的是java反射机制:需要指定类加载器、目标接口以及代理处理器(实现InvocationHandler接口的类)。

Proxy.newProxyInstance(c.getClass().getClassLoader(),c.getClass().getInterfaces(),ih); 

有兴趣的读者,请看我另外一篇blog:

http://shensy.iteye.com/blog/1698197 Java动态代理详解

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics