代理模式

作者: 将代码写成诗 | 来源:发表于2019-09-26 23:44 被阅读0次

代理模式基本概念

为其他对象提供一种代理,以控制对这个对象的访问。

应用

  • 远程代理
    为不同地理的对象提供局域代表对象
  • 虚拟代理
    根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建
  • 保护代理
    权限控制
  • 智能代理
    售卖火车票(静态 代理和动态代理)

代理模式实现-静态代理

静态代理:代理和被代理对象在代理之前是确定的。他们都实现相同的接口或者继承相同的抽象类


editByWpp.png

-- 基本类支持

/**
 * @author wpp25
 * @date 2019/9/20 20:43
 * @description:
 */
public class Car implements Movable{
    public void move() {

        try {
            Thread.sleep(new Random().nextInt(1000));
            System.out.println("汽车行使中。。。");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
/**
 * @author wpp25
 * @date 2019/9/20 20:57
 */
public interface Movable {
    void move();
}

  • 继承的方式实现静态代理
/**
 * @author wpp25
 * @date 2019/9/20 21:02
 * @description: 继承的方式实现静态代理
 */
public class Car2 extends Car {
    @Override
    public void move() {
        long startTime = System.currentTimeMillis();
        System.out.println("汽车开始行使。。。");
        super.move();
        long endTime = System.currentTimeMillis();
        System.out.println("行驶时间:"+(endTime-startTime)+"ms");
    }
}
  • 聚合的方式实现静态代理
public class Car3 implements Movable {
    private Car car;

    public Car3(Car car) {
        this.car = car;
    }

    public void move() {
        long startTime = System.currentTimeMillis();
        System.out.println("汽车开始行使。。。");
        car.move();
        long endTime = System.currentTimeMillis();
        System.out.println("行驶时间:"+(endTime-startTime)+"ms");
    }
}
editByWpp.png

小结:

聚合比继承更灵活

动态代理

实现对不同类,不同方法的代理


editByWpp.png

java动态代理类位于java.lang.reflect包下,一般主要涉及到以下连两个类:
1)Interface InvocationHandler:该接口仅定义了一个方法
public object invoke (Object obj,Method method,Object[] args)在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现
2)Proxy:该类即为动态代理类
static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理类中的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在接口中声明过的方法)

原理--- 代理模式-动态代理

所谓Dynamic Proxy 是这样一种class:
它是在运行时生成的class
该class需要实现一组interface
使用动态代理时,必须实现InvacationHandler接口

动态代理实现步骤

  • 1、创建一个实现接口InvocationHandler的类,它必须实现invoke方法
  • 2、创建被代理的类以及接口
  • 3、调用Proxy的静态方法创建一个代理类
    newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
  • 4、通过代理调用方法

cglib代理

editByWpp.png

相关文章

  • 设计模式

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