一、代理模式的作用
把主要业务与次要业务进行松藕合的组装
二、代理模式的本质
例子:
<inpit type="button" onclick="处理函数"> //
本质:监控行为的特征
三、生活案例:
饭前便后要洗手
1.首先分析出主要业务与次要业务
【主要业务】吃饭 上厕所
【次要业务】洗手
2.JDK代理模式的实现
1.接口角色:定义所有需要被监听的行为
2.接口的实现类:中国人、印度人
3.通知类:1)对次要业务进行具体的实现
2)通知JVM,当前被拦截的主要业务方法与次要业务方法该如何绑定
4.监控对象(代理对象):
1)被监控的实例对象 2)需要被监控的行为 3)具体通知类实例对象
**对所有人进行生活监控
在src下建立接口(Interface)com.**.service 名为BaseService {在此接口只声明需要被监控行为}
public intreface BassService{
public void eat();
public void wc();
}
在src建立com.**.servicempl 名为person的实现类 选择BaseService 接口
public void eat(){ //主要业务,代理要求开发人员只需关心主要业务
System.out.println("使用筷子吃饭");
}
public void wc(){
System.out.println("测试地球引力有没有减弱");
}
}
建立一个工具类com.**.util 生成名为Invaction的通知类(要想成为JDK的通知类,那么它必须是InvocationHandler接口的实现类)
选择InvocationHandler接口
声明属性: public BaseService obj;//具体被监控对象
public Invaction(BaseService param){
this.obj = param;
}
/**
*invoke方法:在被监控行为将要执行时,会被JVM拦截。这时被监控行为和行为实现方会被作为参数输送给invoke
* 主要职责--通知JVM, 这个被拦截方法是怎样与当前的次要业务方法绑定实现
*invoke方法中三个参数
*
* 阿三.wc(); //JVM拦截
* wc方法封装为Method 类型对象
* wc方法在运行时接受所有的实参封装到Object[]
* 将负责监控阿三的代理对象作为invoke 方法的第一个参数Object
**/
public Object invoke(Object porxy, Method method ,Object[] params) thoes Throwable{
//0.局部变量,接受主要业务方法完成后返回值
Object value;
//1.确认被拦截行为
String methodName = method . getName();
//2.根据被拦截行为不同,决定主要业务和次要业务怎样绑定
if ("eat". equals ( methodName)){ //饭前洗手
wash();
//洗手
value = method . invoke ( this. obj , params ); //吃饭
}else{ //便后洗手
wash(); //洗手
value = method . invoke ( this. obj , params ); //厕所
}
return value; //返回被拦截方法所需调用的地方
}
//次要业务
public void wash(){
System.out.println("洗手 ");
}
创建监控对象(代理对象)在util中在建立一个工具类ProxyFactory不需要接口
/*
*
*
*参数:class文件,监控类
*
*
*
**/
public static BaseService Builder() { //做成静态节省内存
//1.创建监控类实例对象
BaseService obj = (BaseService ) classFile. newInstance();
//2.创建通知对象
InvocationHandler adviser = new Invocaion(obj);
//3.向JVM申请负责监控obj指定行为的监控对象(代理对象)
BaseService $Proxy . newProxyInstance (obj.getClass().getclassLosder , obj.getClass().getInterfaces,h)
return $proxy;
//loder: 被监控对象隶属的类文件在内存中的真实位置
//interfaces:被监控文件隶属的类文件实现接口
//h:监控对象发现阿三要执行被监控行为,应该有哪一个通知对象进行辅助
}