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

简介: 1 代理模式定义定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。本篇文章主要介绍的是静态代理,关于动态代理请参考:设计模式之动态代理(dynamic proxy)2 代理模式的作用在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介

1 代理模式定义

定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。

本篇文章主要介绍的是静态代理,关于动态代理请参考:设计模式之动态代理(dynamic proxy)

2 代理模式的作用

  • 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
  • 通过代理类对原有类进行功能增强,如增加缓存、异常处理、日志处理等,Spring AOP用的就是(动态)代理模式

3 代理模式一般涉及到的角色有:

  • 抽象主题(Subject):声明真实对象和代理对象的共同接口;
  • 代理(Proxy):代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
  • 真实对象(RealSubject):代理角色所代表的真实对象,是我们最终要引用的对象。

    这里写图片描述

4 应用场景举例:

下面我们就拿用户买火车票举一个例子,传统的火车票购买方式就是去火车站购买,除此之外,我们还可以通过火车票代售点或者12306网站购买,其实这里的火车票代售点就扮演着代理角色。下面我们通过代码演示一遍。

我们要购买火车票,就得有人卖票,我们定义一个卖票Subject

public interface TicketSubject {
   public void sell();
}

然后我们定义一个真实对象,传统的卖票的地方是火车站:

public class TrainStation implements TicketSubject {
   public void sell() {
   System.out.println("卖出一张票!");
   }
}

最后再定义一个代理对象,火车站太远,我们想从代售点买票,定义一个代售点做代理类:

public class TrainStationProxy implements TicketSubject {
   private TrainStation trainStation;//持有真实对象的引用
   public TrainStationProxy(TrainStation trainStation){
       this.trainStation=trainStation;
   }

  public void sell() {
      System.out.println("欢迎光临!");
      trainStation.sell();//调用真实对象的方法,体现代理行为
      System.out.println("请交手续费!");
   }
}

从代理类来看,它和真实对象实现的是同一个主题接口,并且内部还持有真实对象的引用,在自己的方法内调用真实对象的方法,完美的进行了代理,当然代理类可以在自己的方法里面添加一些额外的功能。

最后,我们测试一下

定义一个买票的人:

public class SomeBody {
   private TicketSubject tickSubject;
   public void buy(){
      tickSubject.sell();
   }
   public void goToTicketSubject( TicketSubject tickSubject){
      this.tickSubject=tickSubject;
   }
}

注意,买票人依赖的是接口而不是具体实现类,这样就可以用代理类替换实际类了。

最后,这个人去代售点买票:

public class TestProxy {
   public static void main(String[] args) {
      SomeBody someBody=new SomeBody();
      TrainStationProxy adaptor=new TrainStationProxy(new TrainStation());
      someBody.goToTicketSubject(adaptor);
      someBody.buy();
   }
}

看一下打印结果:

欢迎光临!
卖出一张票!
请交手续费!

代理类完成了购票,还增加了收取手续费的功能!

本篇文章主要介绍的是静态代理,关于动态代理请参考:设计模式之动态代理(dynamic proxy)

目录
相关文章
|
5月前
|
设计模式 缓存 监控
【设计模式系列笔记】代理模式
代理模式是一种结构型设计模式,它允许一个对象(代理对象)控制另一个对象的访问。代理对象通常充当客户端和实际对象之间的中介,用于对实际对象的访问进行控制、监控或其他目的。
104 1
|
5月前
|
设计模式 缓存 安全
小谈设计模式(8)—代理模式
小谈设计模式(8)—代理模式
|
1月前
|
设计模式 缓存 安全
设计模式——代理模式
静态代理、JDK动态代理、Cglib 代理
设计模式——代理模式
|
5月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
55 1
|
1月前
|
设计模式 Java 数据安全/隐私保护
Java设计模式-代理模式(7)
Java设计模式-代理模式(7)
|
5月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
2月前
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
2月前
|
设计模式
设计模式的基础问题之代理模式在工作中的问题如何解决
设计模式的基础问题之代理模式在工作中的问题如何解决
|
3月前
|
设计模式 算法 Go
iLogtail设计模式问题之代理模式在iLogtail中是如何应用的
iLogtail设计模式问题之代理模式在iLogtail中是如何应用的
|
3月前
|
设计模式 缓存 JavaScript
js设计模式【详解】—— 代理模式
js设计模式【详解】—— 代理模式
28 0