美文网首页
代理模式

代理模式

作者: CodeYang | 来源:发表于2021-09-12 14:32 被阅读0次

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

组成

  • 抽象角色:声明真实角色实现的业务方法。
  • 代理角色:代理真实角色,并且可以附加行为
  • 真实角色:定义真实角色所要实现的业务逻辑,供代理角色调用。

静态代理

/**
 * 静态代理
 */
public class Test {

    public static void main(String[] args) {
        new T01Proxy(new T01()).say();
    }

    /**
     * 代理
     */
    static class T01Proxy implements TInterFace{
        private TInterFace t;
        public T01Proxy(TInterFace t){
            this.t = t;
        }

        @Override
        public void say() {
            System.out.println("前置处理");
            t.say();
            System.out.println("后置处理");
        }
    }

    /**
     * 被代理对象
     */
    static class  T01 implements TInterFace {
        @Override
        public void say() {
            System.out.println("T01 say .......");
        }
    }


    interface TInterFace {
        void say();
    }
}

JDK动态代理类示例

public class MyJdkInvocationHandler implements InvocationHandler {

    //被代理对象
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    /**
     *
     * @param proxy 代理类对象
     * @param method 被代理执行的方法
     * @param args  目标方法参数
     * @return 防止执行的返回值
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("日志收集中...");
        Object result= method.invoke(target,args);
        System.out.println("日志收集结束...");
        return result;
    }

    public <T> T getProxy(){
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }
}


public class TestMain {

    public static void main(String[] args) {
        MyJdkInvocationHandler proxy = new MyJdkInvocationHandler();
        proxy.setTarget(new TestServiceImpl());
        TestService testService = proxy.getProxy();
        testService.read("小小孩");
        testService.write("大男孩");
    }
}

Cjlib动态代理类示例

public class TestMain {public class MyCjlibIProxy implements MethodInterceptor {

    //被代理对象
    private Object target;

    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        // 设置回调方法
        enhancer.setCallback(this);
        // 创建代理对象
        return enhancer.create();
    }

    public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("日志收集中。。。");
        Object result = proxy.invokeSuper(object, args);
        System.out.println("日志收集结束。。。");
        return result;

    }
}

public class TestMain {
    private static void  testCjlibProxy(){
        MyCjlibIProxy proxy = new MyCjlibIProxy();
        TestService testService = (TestService)proxy.getInstance(new TestServiceImpl());
        testService.read("小小孩");
        testService.write("大男孩");
    }
}

相关文章

  • 设计模式

    单例模式 模板方法模式 工厂模式 代理模式 静态代理 JDK动态代理

  • 设计模式

    单例模式 代理模式 静态代理 jdk动态代理 cglib动态代理 工厂模式 适配器模式 建造者模式 观察者模式

  • kube-proxy的3种模式

    userspace代理模式 iptables代理模式 IPVS代理模式 https://kubernetes.io...

  • 第4章 结构型模式-代理模式

    一、代理模式简介 二、代理模式3个角色 三、代理模式的优点 四、代理模式的实例(游戏代练)

  • 理解代理模式

    原创博客地址 简介 代理模式,也叫做委托模式,分为:静态代理动态代理 代理模式也是平时比较常用的设计模式之一,代理...

  • 结构型 代理模式(文末有项目连接)

    1:什么是代理模式 2:没用代理模式时的实例 3:使用代理模式将其解耦(静态代理) 3:使用代理模式将其解耦(动态...

  • 设计模式-动态代理模式

    之前介绍了代理模式,大家也都了解了代理模式,不过之前介绍的代理模式是静态代理,静态代理什么意思?静态代理指的是代理...

  • 代理模式

    一、什么是代理模式 代理模式(Proxy pattern):代理模式又叫委托模式,是为某个对象提供一个代理对象,并...

  • 设计模式之代理模式(Proxy模式)

    代理模式的引入 代理模式的实例程序 代理模式的分析 代理模式的引入 Proxy是代理人的意思,指的是代替别人进行工...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

网友评论

      本文标题:代理模式

      本文链接:https://www.haomeiwen.com/subject/fnlxbltx.html