美文网首页
代理模式

代理模式

作者: 知_秋_ | 来源:发表于2018-06-14 23:40 被阅读0次
  • 代理模式,是对一个对象提供代理,用代理对象控制对实际对象的访问。
  • 静态代理,可以分为抽象角色,真实角色,代理角色三种角色。
/**
 * 码农接口(抽象角色)
 */
public interface Coder {
    // 码农可以编码
    void develop(String demandName);
}
/**
 * java码农
 */
public class JavaCoder implements Coder {
    /**
     * java码农编码接口
     */
    @Override
    public void develop(String demandName) {
      System.out.println("java码农进行编码...");
    }
}
/**
 * 码农代理类
 */
public class CoderProxy implements Coder {
    private Coder javaCoder = null;
    public CoderProxy(Coder javaCoder) {
        this.javaCoder = javaCoder;
    }
    @Override
    public void develop(String demandName) {
        if (demandName.startsWith("Add")) {
            // 不再接受新增功能的需求了
            System.out.println("No longer receiver 'Add' demand!");
            return;
        }
        javaCoder.develop(demandName);
    }
}
public class Client {
    public static void main(String[] args) {
        // 真实的java码农对象
        Coder realCoder = new JavaCoder();
        // 代理对象
        Coder proxyCoder = new CoderProxy(realCoder);
        // 通过代理访问对象
        proxyCoder.develop("Add new user");
    }
}
  • 动态代理,相对于静态代理而言,动态代理是在代码运行时创建的一种模式。
  • 实现动态代理,通过动态代理类来实现,不需要实现代理类也不需要实现抽象接口。
/**
 * 码农动态代理类
 * 通过实现InvocationHandler接口的方式实现动态代理类
 */
public class CoderDynamicProxy implements InvocationHandler {
    // 代理的实例
    private Coder coder;

    public CoderDynamicProxy(Coder coder) {
        this.coder = coder;
    }

    /**
     * 调用代理方法
     *
     * @param proxy
     * @param method 具体方法
     * @param args   具体方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before...");
        Object result = method.invoke(coder, args);
        System.out.println("after...");
        return result;
    }
    
}
  • 动态代理可以在程序运行时,同时对多个方法进行代理,不需要对这些方法一个个的进行修改。
/**
 * 客户端
 */
public class Client2 {

    /**
     * 使用码农动态代理类
     * @param args
     */
    public static void main(String[] args) {
        // 要代理的码农对象
        Coder coder = new JavaCoder();
        // 动态代理代理类
        InvocationHandler handler = new CoderDynamicProxy(coder);
        // 动态生成一个代理类,该代理类对所有方法进行了代理
        Coder proxy = (Coder)Proxy.newProxyInstance(coder.getClass().getClassLoader(), coder.getClass().getInterfaces(), handler);

        proxy.develop("add");

    }

}

相关文章

  • 设计模式

    单例模式 模板方法模式 工厂模式 代理模式 静态代理 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/nerzsftx.html