博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代理模式
阅读量:4100 次
发布时间:2019-05-25

本文共 5191 字,大约阅读时间需要 17 分钟。

代理模式:代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息,过滤消息,把消息转发给委托类,以及事后处理消息等,代理类与委托类之间存在关联关系,代理类对象本身不真正实现服务,而是通过委托类的对象的相关方法来提供特定的服务,可以借助代理模式增加一些功能(开闭原则,增加功能),代理类的分类:

(1)静态代理:在程序运行前,代理类的.class文件已经存在了

/** *  * @author Administrator * @date   2018年10月2日 * @package design_pattern * 接口,一个人可以被代理的行为 */interface AgencyTest{	public void buyHouse();		public void findJob();}class worker implements AgencyTest{	@Override	public void buyHouse() {		System.out.println("工人:我要买一套两居室的价格在30万左右的房子");	}	public void findJob() {		System.out.println("工人:我想要找一个不拖欠工资的工作");	}}class whiteCollar implements AgencyTest{	@Override	public void buyHouse() {		// TODO 自动生成的方法存根		System.out.println("白领:我想要买一套交通方便的房子,面积不要太大");	}	@Override	public void findJob() {		// TODO 自动生成的方法存根		System.out.println("白领:我想要找一份加班少,待遇好的公司");	}}class Agency implements AgencyTest{	private AgencyTest person;	public Agency(AgencyTest person) {		this.person = person;	}	@Override	public void buyHouse() {		// TODO 自动生成的方法存根		System.out.println("中介:您好,欢迎选择购房中介,您有什么需求?");		person.buyHouse();		System.out.println("中介:我们会尽快帮您找到合适的房源");	}	@Override	public void findJob() {		// TODO 自动生成的方法存根		System.out.println("中介:您好,欢迎光临工作无忧,您对工作有什么需求?");		person.findJob();		System.out.println("中介:感谢您的光临,我们会尽快帮您匹配合适的岗位");	}}public class StaticAgencyDemo{	public static void main(String[] args) {		worker w = new worker();		whiteCollar wc = new whiteCollar();		Agency agency1 = new Agency(w);		agency1.buyHouse();		agency1.findJob();		Agency agency2 = new Agency(wc);		agency2.buyHouse();		agency2.findJob();	}}

(2)动态代理:在程序运行时,运用反射机制动态创建而成,JDK动态代理代理的是接口,通过Proxy的newProxyInstance得到代理对象;Cglib动态代理,代理的是类,不需要业务继承接口,通过派生子类来实现代理

动态代理的好处:简化了编程工作,提高了软件系统的可扩展性

//JDK动态代理import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 目标要实现的接口 * @author Administrator * @date   2018年10月2日 * @package design_pattern */interface JDKDemoInter{	public void detailShow(String s);}/** * 要代理的类 * 必须要有实现的接口 * @author Administrator * @date   2018年10月2日 * @package design_pattern */class JDKClassDemo implements JDKDemoInter{	private String name;	@Override	public void detailShow(String s) {		// TODO 自动生成的方法存根		System.out.println("你好,我是JDKClassDemo,你输入的是"+s);	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}}/** * jdk动态代理 * 使用java.lang.reflect.proxy类来实现代理 * @author Administrator * @date   2018年10月2日 * @package design_pattern */class JDKProxy1{	private Object obj;	public JDKProxy1(Object obj) {		this.obj = obj;	}	//生成代理对象	/**	 * classloader 对象的类加载器	 * Class
[] interfaces目标对象实现的接口类型 * InvocationHandler 事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入 * @return */ public Object getProxyInstance() { return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), new InvocationHandler(){ @Override public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ System.out.println("执行前"); Object returnObj = method.invoke(obj, args); System.out.println("执行后"); return returnObj; } }); }}class JDKProxy2 implements InvocationHandler{ private Object obj; public Object getInstance(Object obj) { this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ System.out.println("执行前"); Object returnObj = method.invoke(this.obj, args); System.out.println("执行后"); return returnObj; }}public class JDKDynamicAgencyDemo { public static void main(String[] args) { // TODO 自动生成的方法存根 JDKClassDemo demo = new JDKClassDemo(); JDKDemoInter proxyDemo = (JDKDemoInter)new JDKProxy1(demo).getProxyInstance(); proxyDemo.detailShow("000"); JDKClassDemo demo1 = new JDKClassDemo(); JDKDemoInter proxyDemo1 = (JDKDemoInter)new JDKProxy2().getInstance(demo1); proxyDemo.detailShow("111"); }}
//cglib动态代理import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;class CglibClass{	public void say() {		System.out.println("this is CglibClass");	}	public static void say1() {		System.out.println("this is static");	}	public final void say2() {		System.out.println("this is final");	}}class CglibProxy implements MethodInterceptor{	//目标对象	private Object obj;		public CglibProxy(Object obj) {		this.obj = obj;	}	//生成代理对象	public Object getProxyInstance() {		//设置工具类		Enhancer en = new Enhancer();		//设置父类		en.setSuperClass(obj.getClass());		//设置回调函数		en.setCallable(this);		//返回创建的子类(代理对象),因为cglib又被称为子类代理		return en.create();	}	@Override	public Object intercept(Object arg0,Method method,Object[] arg2,MethodProxy arg3) throws Throwable {		System.out.println("执行前");		Object returnObj = method.invoke(obj, arg2);		System.out.println("执行后");		return returnObj;	}}public class cglibDynamicAgencyDemo {	public static void main(String[] args) {		// TODO 自动生成的方法存根		CglibClass cglib = new CglibClass();		CglibClass proxy = (CglibClass)new CglibProxy(cglib).getProxyInstance();		System.out.println(proxy);		proxy.say();		proxy.say1();		proxy.say2();	}}

 

转载地址:http://ugeii.baihongyu.com/

你可能感兴趣的文章
Android中的Binder(二)
查看>>
Framework之View的工作原理(一)
查看>>
Web应用架构
查看>>
设计模式之策略模式
查看>>
深究Java中的RMI底层原理
查看>>
用idea创建一个maven web项目
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
DES加解密
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
数据结构之单链表——C++模板类实现
查看>>
Linux的SOCKET编程 简单演示
查看>>
正则匹配函数
查看>>