代理模式

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

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值