zoukankan      html  css  js  c++  java
  • 代理模式 笔记

    代理模式的作用:为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    代理模式涉及到的角色有:

    1. 抽象角色:声明真实对象和代理对象的共同接口。

    2. 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象,同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

    3. 真实对象:代理角色所代表的真实对象,是我们最终要引用的对象。

    一、静态代理:

         IHello -->HelloLoggerProxy.greeting()

                 |

                  -->HelloImpl.greeting()

    1 IHello hello = new HelloLoggerProxy(new HelloImpl());
    2 hello.greeting("hello");

    二、动态代理:用到反射机制,即通过反射动态生成对象

         IHello -->HelloImpl.greeting()

         InvocationHandler-->DynamicLoggerProxy.bind()&invoke()

    1 IHello hello = (Hello) new DynamicLoggerProxy().bind(new HelloImpl());
    2 hello.greeting("hello");

    三、CGLib: 上面两种方法必须依赖IHello接口,如果不想依赖于IHello接口,就要引入CGLib:

         Hello.greeting()

         net.sf.cglib.proxy.Enhancer/MethodInterceptor/MethodProxy -->CGLibLoggerProxy.bind()&interceptor()

     1 bind(Object delegate) {
     2     Enhancer enhancer = new Enhancer();
     3     enhancer.setCallback(this);
     4     enhancer.setSupperclass(delegate.getClass());
     5     return enhancer.create();
     6 }
     7 interceptor(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
     8     return proxy.invokeSuper(obj, args);
     9 }
    10 Hello hello = (Hello) new CGLIBLoggerProxy().bind(new Hello());
    11 hello.greeting("hello");
    路慢慢其休远羲,吾将上下而求所
  • 相关阅读:
    XML基础
    vue项目使用WebViewJavascriptBridge
    vue cli3 打包部署 Failed to load resource: net::ERR_FILE_NOT_FO 找不到路径问题
    js 将一个数组插入到另一个数组的方法
    div随意拖动小例子
    带转义符的json解释
    银行卡四位数空隔
    收录-获取时间、日期
    封装的一些例子
    easyui-validatebox 验证
  • 原文地址:https://www.cnblogs.com/garinzhang/p/2944052.html
Copyright © 2011-2022 走看看