动态代理模式(简单实现,食堂阿姨打饭例子)

动态代理模式

(后面有源代码,可直接划到后面看)
图我自己画的,看懂看,不懂就算啊了

动态代理的目的:

动态地生成代理类,解决静态代理所产生的一个类需要一个代理类的缺点。

主要方法:

通过编写一个可以生成代理类的工具类来动态的生成代理类,根据传入的真实对象不同,产生的代理类也不同。

原理:

java的反射机制
即动态的生成类。

步骤:

  1. 根据真实对象需要实现的方法写一个接口或者抽象类。
  2. 真实对象实现这个接口
  3. 编写动态生成代理类的“工具类”
  4. 在主函数中创建真实对象,将真实对象传入“工具类”,工具类根据真实对象实现的接口生成一个代理类。
  5. 调用代理类的方法完成。

简介

相比于静态代理中,(真实对象,厨师)(代理类,食堂阿姨)(主函数,吃客)的比喻

动画规划可以理解为(真实对象,厨师)(“工具类”,中介公司(可以派出各种中介,婚介,房屋中介,租赁中介,食堂阿姨等))(主函数,吃客)

源代码

1声明接口

package org.lanqiao.invocationHanderDemo;

public interface SaleFood {
	public void saleFood();
}

2真实对象类来实现接口

package org.lanqiao.invocationHanderDemo;

public class Cookor implements SaleFood {

	@Override
	public void saleFood() {
		// TODO Auto-generated method stub
		System.out.println("你得到了food");
	}
	
}

3写一个动态生成代理类的类,实现一个invocationHandler的接口,重写里面的invoke方法
代码基本上是固定的

package org.lanqiao.invocationHanderDemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class InvocationHanderDemo  implements InvocationHandler{
//用于传入真实对象
	private Object target;
	
	
	public InvocationHanderDemo(Object target) {
		super();
		this.target = target;
	}

	public void setTarget(Object target) {
		this.target = target;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		//辅助方法
		dou();
		//调用实现了接口实现的方法
		Object result=method.invoke(target, args);
		dou();
		return result;
	}
	
	public void dou() {
		System.out.println("手抖");
	}

	

}

测试类

package org.lanqiao.invocationHanderDemo;

import java.lang.reflect.Proxy;

public class Test_IH {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//真实对象
		Cookor cookor=new Cookor();
		InvocationHanderDemo ihd=new InvocationHanderDemo(cookor);//创建动态代理类
		SaleFood proxy=(SaleFood)Proxy.newProxyInstance(ihd.getClass().getClassLoader(),cookor.getClass().getInterfaces(),ihd );//生成代理类,!!接口类型
		proxy.saleFood();
	}

}

注意这里proxy的类型是接口的那个类型!!不然会报错
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值