你的代言人-代理模式

概述

代理模式为其他对象提供一种代理以控制对这个对象的访问。也就是当你想访问某个对象时,不能直接访问它而需要通过它的代理对象来进行访问。就好比你要拜访某位名人,都是需要先通过他的助理,助理在这里就起到了代理的作用。

类图

在这里插入图片描述

在代理模式中,有几种角色

  • 抽象角色(AbstractSales)定义了抽象的产品
  • 真实角色(RealSales)抽象产品的实现者
  • 代理角色(ProxySales)负责代理RealSeles的所有功能

代码实现

//抽象角色
public abstract class AbstractSales {
    public abstract void sales();
    public abstract void price();
}

//真实角色
public class RealSales extends AbstractSales {
    @Override
    public void sales() {
        System.out.println("Real sales");
    }

    @Override
    public void price() {
        System.out.println("Real price");
    }
}

//代理角色
public class ProxySales extends AbstractSales {

    private RealSales realSales;

    public ProxySales(){
        this.realSales = new RealSales();
    }

    @Override
    public void sales() {
        this.realSales.sales();
    }

    @Override
    public void price() {
        this.realSales.price();
    }
}

public class Client {
    public static void main(String [] args){
        AbstractSales sales = new ProxySales();
        sales.sales();
        sales.price();
    }
}

输出结果
Real sales
Real price

其实,在代理类中还可以加上额外的处理,比如:

public class ProxySales extends AbstractSales {

    private RealSales realSales;

    public ProxySales(){
        this.realSales = new RealSales();
    }

    @Override
    public void sales() {
        this.before();
        this.realSales.sales();
        this.after();
    }

    @Override
    public void price() {
        this.realSales.price();
    }

    public void before(){
        System.out.println("sales before");
    }

    public void after(){
        System.out.println("sales after");
    }
}

输出结果:
sales before
Real sales
sales after
Real price

优缺点

优点

  • 职责清晰。各司其职,各个角色不用关心非本职的事务
  • 高扩展性。具体角色不管怎么变化,都离不开抽象角色的限制,只要代理角色实现了抽象角色的功能,就不用关心具体角色的变化
  • 智能化(主要是动态代理)

缺点

  • 在客户端和真实角色之间增加了一层逻辑处理,可能会导致请求变慢
  • 实现代理需要额外的工作,有些代理的实现还比较复杂

使用场景

  • 真实角色不适合暴露出来,可以使用代理对象来进行包装
  • 远程代理、虚拟代理、Copy-on-Write 代理、防火墙(Firewall)代理等等很多使用场景

动态代理

动态代理是代理模式中的重头戏,有另外一篇文章专门来讲解动态代理的相关内容

Spring AOP知识准备-动态代理

总结一下

  • 代理模式:为其他对象提供一种代理以控制对这个对象的访问
  • 代理模式的几种角色
    • 抽象角色(AbstractSales)定义了具体的产品
    • 真实角色(RealSales)具体的产品实现者
    • 代理角色(ProxySales)负责代现RealSeles的所有功能
  • 优点
    • 职责清晰。各司其职,各个角色不用关心非本职的事务
    • 高扩展性。具体角色不管怎么变化,都离不开抽象角色的限制,只要代理角色实现了抽象角色的功能,就不用关心具体角色的变化
    • 智能化(主要是动态代理)
  • 缺点
    • 在客户端和真实角色之间增加了一层逻辑处理,可能会导致请求变慢
    • 实现代理需要额外的工作,有些代理的实现还比较复杂
  • 使用场景
    • 真实角色不适合暴露出来,可以使用代理对象来进行包装
    • 远程代理、虚拟代理、Copy-on-Write 代理、防火墙(Firewall)代理等等很多使用场景
  • 动态代理是在实现阶段不用关心代理类,而在运行阶段才指定代理的对象
  • 一般动态代理有两种实现方式:JDK动态代理、CGLIB动态代理
  • JDK动态代理,代理类与真实类实现同一接口,通过代理类实现InvocationHandler并重写invoke方法来进行动态代理的,在invoke方法中实现额外的处理。缺点:只能够代理实现了接口的类
  • CGLIB动态代理,生成的代理类继承被代理类,通过实现MethodInterceptor接口并重写intercept方法来实现额外的处理。
    缺点:因为要继承,final类以及final方法无法使用CGLIB动态代理

欢迎您关注Java天堂公众号,专注于分享Java相关技术
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/pzjtian/article/details/104258328