Java设计模式---代理模式(动态代理)

Java设计模式---代理模式(动态代理):

a,动态代理设计模式不属于23种设计模式之一
b,动态代理设计模式=代理模式+反射机制
c,可以为项目中所有接口中所有方法进行增强。

动态代理设计模式的实现步骤:

1)创建被帮助对象的接口

package service;
public interface PGService {
	public void giveFlower();
}

2)创建被帮助对象的类

package serviceImp;
import service.PGService;
public class PG implements PGService{
	public void giveFlower() {
		System.out.println("This is the flower for you.");
	}
}

3)创建动态的 代理

package util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;

//import service.PGService;
//import serviceImp.PG;
public class Agent implements InvocationHandler {
{this.zhangsan.giveFlower();System.out.println("Congratulations.");}
	private Object obj;
	public Agent(Object obj) {this.obj=obj;}
	/* 
	 * 第一个 (Object proxy)
	 * 第二个(Method method) 本次正常调用方法 update select save delete
	 * 第三个(Object[] args) 本次正常调用的方法运行时实参
	 * JVM接收到的一个命令,被帮助的对象,一个需要增强的方法。
	 * EmpService obj = xxxxxxx;
	 * object.save("mike",10000);
	 * JVM将当前命令分解,将save方法封装为Method类型对象。save方法运行时所得到的实参封装到一个Object类型的数组中["mike",10000]。
	 * 然后将这三个内容作为参数交给代理实现类中的invoke方法。
	 */
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
		//得到本次要增强的方法的名字
		String methodName = method.getName();
		//日志的输出
		System.out.println(new Date() +":"+ methodName+"开始执行");
		Object result = method.invoke(obj, args);//obj.save("mike",10000);
		System.out.println(new Date() +":"+ methodName+"执行结束");
		return result;}
	public Object getAgent() {
		/*
		 * 参数1:类加载器ClassLoader,正在帮助的对象隶属class
		 * 参数2:接口,正在帮助的对象的方法隶属的接口
		 * 参数3:代理实现类的对象。
		 * /
		 */
		Object lisi= Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
		return lisi;
	}
	}

4)创建测试 main类,进行测试

import java.lang.reflect.InvocationHandler;

import service.PGService;
import serviceImp.PG;
import util.Agent;

public class testMain {
	public static void main(String[] args) throws Exception {
		PGService person = new PG(); //实例化被帮助的对象
		InvocationHandler agent1 = new Agent(person);	//初始化代理
		PGService lisi = (PGService) ((Agent) agent1).getAgent();//让代理熟悉 被帮助对象的 方法
	    ((PGService) lisi).giveFlower();//代理开始工作
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值