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();//代理开始工作
}
}