代理模式 Proxy

Intro

代理模式,给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

比如生活中常见的中介,VPN,网络代理等

利用代理模式,我们可以对实际的操作做一些额外的逻辑,比如加一些异常捕捉,缓存,日志记录或者耗时统计等等,基于动态代理的 AOP 模式也是代理模式的实际应用。

Prototype

public abstract class Subject{    public abstract void Request();}

public class RealSubject : Subject{    public override void Request()    {        Console.WriteLine("request from real subject");    }}

public class Proxy0 : Subject{    private Subject _subject;

    public override void Request()    {        if (null == _subject)        {            _subject = new RealSubject();        }        _subject.Request();    }}

public class Proxy : Subject{    private readonly Subject _subject;

    public Proxy(Subject subject) => _subject = subject;

    public override void Request()    {        _subject.Request();    }}

应用场景

业务系统的非功能性需求开发

代理模式最常用的一个应用场景就是,在业务系统中开发一些非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。我们将这些附加功能与业务功能解耦,放到代理类中统一处理,让程序员只需要关注业务方面的开发。

代理模式在 RPC 中的应用

RPC 框架也可以看作一种代理模式,客户端在使用 RPC 服务的时候,就像使用本地函数一样,无需了解跟服务器交互的细节。除此之外,RPC 服务的开发者也只需要开发业务逻辑,就像开发本地使用的函数一样,不需要关注跟客户端的交互细节。

AOP(面向切面编程)

我们可以基于动态代理来实现一个 AOP 框架,这也是目前 AOP 框架中主流的实现方式,在 .NET 里通常会使用 Emit 动态生成代理类型。

结合 AOP 我们很多非业务功能可以变得很容易实现,比如上面提到的日志、统计,鉴权,事务等,可以让我们更加聚焦于核心业务的实现。

More

代理模式和前面我们提到的装饰模式有些像,他们都可以在不修改原始类的情况下增加新的功能,但是他们是有区别的,代理更多的是强调对对象的访问控制,而装饰更多的在于新增功能,代理通常只有一层代理,而装饰模式可以有很多装饰器,支持多个装饰器的嵌套使用,而且代理模式实际使用的代理对象,而装饰模式实际使用的还是原来的对象只是通过装饰器模式增加了额外功能。

有很多 Wrapper 也是代理模式的实现,通常很多开源项目里的 Proxy/Wrapper 大多数都是代理模式的应用

Reference

  • https://github.com/WeihanLi/DesignPatterns/tree/master/StructurePattern/ProxyPattern

外观模式和代理模式的联系和区别_设计模式之代理模式相关推荐

  1. 外观模式和代理模式的联系和区别_设计模式之代理设计模式

    原文首发于微信公众号:jzman-blog,欢迎关注交流! 今天来看一下什么是代理设计模式,顾名思义,代理就是通过中介代替某人做某一件事,对应到我们的程序中就是通过代理对象来控制某个具体对象某个方法的 ...

  2. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  3. 策略模式和工厂模式的区别_设计模式系列 — 策略模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(si ...

  4. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(sin ...

  5. java 肌汉模式_设计模式之原型模式详解(附源代码)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  6. java桥接和装饰_设计模式:桥接模式和装饰模式

    原标题:设计模式:桥接模式和装饰模式 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是&qu ...

  7. 策略模式和工厂模式的区别_java设计模式之状态模式,策略模式孪生兄弟

    状态模式 状态模式(State Pattern)中,类的行为是基于它的状态改变的,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,状态模式是不停的切换状态执行.这种类型的设计模式属于行为型模 ...

  8. 如何定义适配器adapter类_设计模式22-Adapter(适配器)模式-组件接口适配

    在软件开发过程中,有时候系统的数据和行为都正确,但接口不符合,这时候我们就应该考虑使用适配器模式,适配器的作用即将一个类的接口转换成客户希望的另外一个接口.它使得原本由于接口不兼容而不能一起工作的那些 ...

  9. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

最新文章

  1. 2021-08-05 Ubuntu18.04安装ROS出现的一些问题
  2. python入门的120个基础练习_python入门的120个基础练习(一),自学python必看!!...
  3. 疯狂的程序员-第五章
  4. 【转】ABAP的坑2
  5. Eclipse中DTD验证导致无法进行代码提示的问题 .
  6. step1.day11 C语言基础练习之指针和二级指针
  7. Win-Get——Windows下的自由软件自动安装程序
  8. 记录sqlserver中使用变量
  9. NET中解决KafKa多线程发送多主题的问题
  10. Java小白零基础学习如何突破自己的方法
  11. 利用MFC按钮使能(或禁用)属性使按钮变正常色(或灰色)
  12. 红橙Darren视频笔记 一个控件显示两种颜色的文字 画笔的使用
  13. centos7 卸载安装失败的mysql7
  14. 利用组策略进行软件分发
  15. 使用QT:复刻俄罗斯方块游戏
  16. Ubuntu安装人脸识别认证软件Howdy
  17. 自定义气泡效果(BubbleView)
  18. c语言课设菜单,c语言课程设计菜单
  19. struts2 配置文件中 result的用法
  20. 浅谈爬虫工作中HTTPIP的重要性

热门文章

  1. 编码器 stm32_STM32榨干编码旋钮(第一期)
  2. mysql数据完整性约束包括_MYSQL回顾(完整性约束相关)
  3. php redis事务回滚,【Redis】Redis事务详解,Redis事务不支持回滚吗?
  4. 差分进化算法python_差分进化算法DE-python实现
  5. android横向滑动缩放,移动端实现内容左右滑动,并点击放大效果的问题
  6. oracle 配置监听和TNS常见的问题
  7. nmd测试软件中文,阿迪达斯Boost传说中的踩屎感,NMD跑步真假对比测评!
  8. 3种java实现多线程_实现java多线程的3种方式,99%人没用过第3种
  9. Java Swing Mysql实现的汽车租赁租车管理系统源码附带设计报告及视频导入运行教程
  10. 基于JAVA+Servlet+JSP+MYSQL的客户充值缴费管理系统