前言

今天学习一代理模式,代理模式也是一种很常见的模式。简单记录学习中看到内容,方便自己后续查阅和回顾。

正文

代理模式

为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。

代理模式分为静态代理和动态代理。

设计模式之代理模式

静态代理

静态代理在使用时 , 需要定义接口或者父类 , 目标对象与代理对象一起实现相同的接口或者是继承相同父类。

关键角色:

  1. 接口或父类

  2. 目标对象(也就是被代理的对象)

  3. 代理对象

demo

以客户点外卖为例,点了需要去哪,但客户就是不想去店里拿,所以需要有外卖员。

接口

也就是配送接口

  1. public interface IFoodDelivery {
  2.   void foodDelivery();
  3. }
复制
目标对象

也就是顾客。

顾客也可以配送自己的外卖,也需要实现配送接口。

  1. public class Customer implements IFoodDelivery{
  2.   @Override
  3.   public void foodDelivery() {
  4.       //顾客拿外卖
  5.   }
  6. }
复制
代理对象

外卖员。

顾客不想走路,因此外卖员帮忙拿外卖。

  1. /**
  2. * 外卖员,也就是顾客的代理人
  3. */
  4. public class Deliveryman implements IFoodDelivery {
  5.   private final IFoodDelivery iFoodDelivery;
  6.   public Deliveryman(IFoodDelivery iFoodDelivery) {
  7.       this.iFoodDelivery = iFoodDelivery;
  8.   }
  9.   @Override
  10.   public void foodDelivery() {
  11.       iFoodDelivery.foodDelivery();
  12.   }
  13. }
复制
客户端
  1. Customer customer = new Customer();
  2. Deliveryman deliveryman = new Deliveryman(customer);
  3. deliveryman.foodDelivery();
复制
优缺点
优点
  1. 在不修改目标对象的功能前提下 , 能通过代理对象对目标功能扩展

缺点
  1. 代理对象需要与目标对象实现一样的接口 , 所以会有很多代理类

  2. 一旦接口增加方法 , 目标对象与代理对象都要维护

动态代理

动态代理其实本质上将被代理类包装一层,生成一个具有新的相同功能的代理类。

通过java提供的Proxy类帮我们创建代理对象。

特点:

  1. 代理对象,不需要实现接口

  2. 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要指定创建代理对象/目标对象实现的接口的类型)

  3. 动态代理也叫做:JDK代理,接口代理

相对于静态代理,动态代理不需要代理对象实现接口。

优缺点

代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理。

demo
接口

也就是配送接口

  1. public interface IFoodDelivery {
  2.   void foodDelivery();
  3. }
复制
目标对象

也就是顾客。

顾客也可以配送自己的外卖,也需要实现配送接口。

  1. public class Customer implements IFoodDelivery{
  2.   @Override
  3.   public void foodDelivery() {
  4.       //顾客拿外卖
  5.   }
  6. }
复制
代理对象

主要通过

  1. 1. ClassLoader loader 指定当前目标对象使用的类加载器, 获取加载器的方法固定
  2. 2. Class<?>[] interfaces: 目标对象实现的接口类型,使用泛型方法确认类型
  3. 3. InvocationHandler h : 事情处理,执行目标对象的方法时,会触发事情处理器方法, 会把当前执行的目标对象方法作为参数传入
  4. public static Object newProxyInstance(ClassLoader loader,
  5.                             Class<?>[] interfaces,
  6.                             InvocationHandler h)
复制

下面是客户代理类。

  1. public class CustomerProxy {
  2.   private final Object object;
  3.   public CustomerProxy(Object object){
  4.       this.object = object;
  5.   }
  6.   public Object getProxyInstance(){
  7.       return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() {
  8.           @Override
  9.           public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  10.               return method.invoke(object, args);
  11.           }
  12.       });
  13.   }
  14. }
复制
客户端
  1. Customer customer = new Customer();
  2. IFoodDelivery iFoodDelivery = (IFoodDelivery) new CustomerProxy(customer).getProxyInstance();
  3. iFoodDelivery.foodDelivery();
复制

参考文章

  1. 【Java】代理模式(Proxy模式)详解

  2. Java设计模式-代理模式

  3. 【转载】Java的三种代理模式

相关文章

暂无评论

none
暂无评论...