
1. 代理模式的作用
将主要业务与次要业务进行松耦合组装。
2. 代理模式的本质
监控行为特征
3. 案例
(1)喝果粒果汁
主要业务:喝果汁
次要业务:喝前摇一摇
(2)JDK代理模式实现
接口:定义所有需要被监听行为
接口实现类:农夫果粒,果粒橙
通知类:实现次要业务,当前被拦截的主要业务与次要业务如何绑定执行
代理对象
示例:
(1)创建接口
/*
*
* 只有需要被监控的行为才有资格
* 在这里声明
*
*/
public interface DrinkService {
public void drink();
}
(2)接口实现类
public class Huiyuan implements DrinkService {
@Override
public void drink() {
System.out.println("喝汇源果汁");
}
}
public class Guolicheng implements DrinkService {
@Override
public void drink() {
System.out.println("喝果粒橙");
}
}
(3)通知类
public class GuozhiInvocationHandler implements InvocationHandler { private DrinkService target; public GuozhiInvocationHandler(DrinkService target){
this.target = target;
} // invoke方法:在被监控行为将要执行时,会被JVM拦截,被监控行为和行为实现方会被作为参数输送invoke
// 这个被拦截方法是如何与当前次要业务方法绑定实现
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue = null; if("drink".equals(method.getName())){
yaoyiyao();
returnValue = method.invoke(target,args);
} return returnValue;
} private void yaoyiyao(){
System.out.println("喝前摇一摇");
}
}
(4)代理类
public class ProxyFactory { public static DrinkService builder(Class clazz) throws IllegalAccessException, InstantiationException { //1.创建被监控实例对象
DrinkService target = (DrinkService) clazz.newInstance();
//2.创建一个通知对象
InvocationHandler adviser = new GuozhiInvocationHandler(target);
//3.向JVM申请负责监控target对象指定行为的监控对象(代理对象)
/*
* loader:被监控对象隶属的类文件在内存中真实地址
* interfaces:被监控对象隶属的类文件实现接口
* h:监控对象发现小明要执行被监控行为,应该有哪一个通知对象进行辅助
*/
DrinkService $proxy = (DrinkService) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),adviser);
return $proxy;
}
}
测试类:
public class TestDemo {
public static void main(String[] args) throws InstantiationException, IllegalAccessException { DrinkService huiyuan = ProxyFactory.builder(Huiyuan.class);
huiyuan.drink();
DrinkService guolicheng = ProxyFactory.builder(Guolicheng.class);
guolicheng.drink();
}
}
测试结果:
喝前摇一摇
喝汇源果汁
喝前摇一摇
喝果粒橙