读书笔记之设计模式(代理模式)

代理模式

一、静态代理模式

示例代码

抽象主题角色
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的编程理念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值