代理模式:
1.静态代理
//抽象主题角色
interface Subject{
//定义一个方法
public void request();
}
//具体主题角色
class realSubejct implements Subject{
//实现方法
public void request(){
Syso("简单实现.......");
}
}
//代理主题角色
class Proxy implements Subejct{
//要代理那个实现类
private Subject subject=null;
//默认被代理者
public proxy(){
subject=new RealSubject();//在构造函数中创建被代理对象
}
//通过构造中传递被代理者
public Proxy(Subject _subject){
subject=_subject;
}
//实现接口中定义的方法
public void request(){
before();
subject.request();
after();
}
//预处理
private void before(){
Syso("使用预处理...");
}
//善后处理
private void after(){
Syso("善后处理....");
}
}
2.动态代理
//抽象主题角色
interface Subject{
//定义一个方法
public void request();
}
//具体主题角色
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("小勇吃shi中.....");
}
}
public class Subjecthandler implements InvocationHandler{
//声明呗代理对象
private Subject subject;
public Subjecthandler(Subject _subject){
subject=_subject;
}
//委托处理方法
@Override
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 class Client {
public static void main(String[] args) {
// 具体主题角色
Subject subject = new RealSubject();
// 代理实例的处理Handler
InvocationHandler handler = new Subjecthandler(subject);
// 当前加载器
ClassLoader cl = subject.getClass().getClassLoader();
// 动态代理
Subject proxy = (Subject) Proxy.newProxyInstance(cl, subject.getClass()
.getInterfaces(), handler);
// 执行主题角色方法
proxy.request();
}
}
动态代理很容易实现通用的代理类,只要在Invocationhandler的invoke方法
中读取持久化数据即可实现,而且还能实现动态切入的效果,这也是AOP编程事项.