代理模式
定义:为某个对象提供一个代理,以控制对这个对象的访问。代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。
代理模式UML类图:
解释说明:代理类Proxy,和实际主题RealSubject都实现了抽象主题Subject的接口,且Proxy中包含RealSubject的引用,这样代理的实例就可以控制对它所包含的RealSubject角色实例的访问,即可以控制它所代理的对象的访问,从而达到代理目的。
静态代理模式案例
说明:静态代理是由程序员创建或者工具生成代理类的源码,再编译代理类所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
代码:
packageorg.sdibt.freebird.pattern;
/**
* 被代理者
* @author 15684
*/
publicclass RealStudent implements ISign{
@Override
publicvoid sign() {
// TODO Auto-generated method stub
System.out.println("--------本人跟学校签订就业协议--------");
}
}
packageorg.sdibt.freebird.pattern;
/**
* 代理者
* @author 15684
*/
publicclass ProxyStudent implements ISign{
privateRealStudent real;
publicRealStudent getReal() {
returnreal;
}
publicvoid setReal(RealStudent real) {
this.real = real;
}
@Override
publicvoid sign() {
// TODO Auto-generated method stub
System.out.println("-------代理前请出示身份证--------");
this.getReal().sign();
}
}
packageorg.sdibt.freebird.pattern;
/**
* 接口
* @author 15684
*/
publicinterface ISign {
voidsign();
}
packageorg.sdibt.freebird.pattern;
/**
* 测试代理类
* @author 15684
*/
publicclass TestProxy {
publicstaticvoid main(String[] args) {
RealStudent real = new RealStudent();
ProxyStudent proxy = new ProxyStudent();
proxy.setReal(real);
proxy.sign();
}
}
动态代理模式案例
/**
* 接口
* @author15684
*/
publicinterface ISign {
void sign();
}
/**
* 定义切面
* @author15684
*/
publicclass MyAspectHandler implements InvocationHandler{
private Object target;
public Object getTarget() {
returntarget;
}
publicvoid setTarget(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 定义切面
System.out.println("----代理前请出示身份证。。。。。");
Object invoke = method.invoke(target);
System.out.println("------代理完成后电话告知------");
returninvoke;
}
}
/**
* 被代理者
* @author15684
*/
publicclass RealStudent implements ISign{
@Override
publicvoid sign() {
// TODO Auto-generated method stub
System.out.println("--------本人跟学校签订就业协议--------");
}
}
/**
* 测试动态代理
* @author15684
*/
publicclass TestDynamicProxy {
publicstaticvoid main(String[] args) {
MyAspectHandler myAspectHander = new MyAspectHandler();
myAspectHander.setTarget(new RealStudent());
ISign proxy = (ISign) Proxy.newProxyInstance(RealStudent.class.getClassLoader(), new Class[] {ISign.class}, myAspectHander);
proxy.sign();
}
}