代理模式
一、静态代理模式
示例代码
抽象主题角色
interface Subject {
//定义一个方法
public void doSomething();
}
具体主题角色
class RealSubject implements Subject {
//实现方法
public void doSomething(){
//具体业务逻辑处理
}
}
代理主题角色
class Proxy implements Subject {
//要代理哪个实现类
private Subject subject = null;
//默认被代理者
public Proxy(){
subject = new Realsubject();
}
//通过构造函数传递被代理者
public Proxy(Subject _subject){
subject = _subject;
}
//实现接口中定义的方法
public void doSomething() {
before();
subject.doSomething();
after();
}
//预处理
private void before(){
//do something
}
//后处理
private void after(){
//do something
}
}
二、动态代理模式
示例代码
抽像主题角色
interface Subject {
//定义一个方法
public void doSomething();
}
具体主题角色
class RealSubject implements Subject {
//实现方法
public void doSomething(){
//具体业务逻辑处理
}
}
定义一个SubjectHandler类
class SubjectHandler implements InvocationHandler {
//被代理的对象
private Subject subject;
public SubjectHandler(Subject _subject) {
subject = _subject;
}
//委托处理方法
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {
//预处理
System.out.println("预处理");
//直接调用被处理类的方法
Object obj = method.invoke(subject,args);
//后处理
System.out.println("后处理");
return obj;
}
}
动态代理使用场景代码
public static void main(String[] args) {
//具体主题角色,也就是被代理类
Subject subject = new RealSubject();
//代理实例的处理Handler
Invocationhandler handler = new SubjectHandler(sunject);
//当前加载器
ClassLoader cl = subject.getClass().getClassLoader();
//动态代理
Subject proxy = (Subject) Proxy.newProxyInstance(cl,subject.getClass().getInterfaces(),handler);
//执行具体主题角色方法
proxy.doSomething();
}
动态代理很容易实现通用的代理类,只要在InvocationHandler的invoke方法中读取持久化数据即可,还能实现动态切入的效果,这也是AOP的编程理念。