码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 代理模式——设计模式


    一、定义

    代理模式在软件开发中经常用到,它是指为对象提供一种的代理,以控制对这个对象的直接访问。代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。

    代理模式分文:静态代理和动态代理

    二、优缺点

    优点: 1、职责清晰。 2、高扩展性。 3、智能化。

    缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

    使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

    注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

    三、自己的理解

    把一项能力抽象成接口,让真实类和代理类同时实现,然后让代理类持有真实类的引用对象,在代理类实现的接口方法中来调用真实类对应的接口方法,在外部想使用真实类的这项能力的时候,通过调用代理类的方法来达到调用真实类的方法,这样外部就不能直接访问和修改真实类了,只能通过代理类,而代理类我们只暴露了我们想让外部访问和修改的逻辑,这就起到了保护真实类的作用,同时我们还可以在代理类中增加一些真实类没有的功能的代码,这样就起到了增强真实类的作用。

    四、静态代理代码实现

    1. //小明 通过 张三 通过送礼物去追求 小红
    2. //把送礼物这个能力抽象成接口
    3. interface GiveGift {
    4. fun giveFlowers()
    5. fun giveChocolate()
    6. fun giveDolls()
    7. }
    8. //真实的追求者
    9. class Pursuit(val name: String) : GiveGift {
    10. override fun giveFlowers() {
    11. print("${name}送鲜花")
    12. }
    13. override fun giveChocolate() {
    14. print("${name}送巧克力")
    15. }
    16. override fun giveDolls() {
    17. print("${name}送洋娃娃")
    18. }
    19. }
    20. //代理 帮真实追求者送礼物的
    21. //参数是被追求者的名字
    22. class Proxy(val pursuedName : String) : GiveGift {
    23. //在代理类中,被追求者和追求者互相不认识,达到了保护的作用
    24. var pursuit: GiveGift? = null
    25. override fun giveFlowers() {
    26. run{
    27. pursuit ?: Pursuit("小明")
    28. }.giveFlowers()
    29. print("给$pursuedName")
    30. println()
    31. }
    32. override fun giveChocolate() {
    33. run{
    34. pursuit ?: Pursuit("小明")
    35. }.giveChocolate()
    36. print("给$pursuedName") //代理认识被追求者,起到了增强的作用,没有简单地代理送礼物的功能,而是帮助追求者送给了代理认识的人
    37. println()
    38. }
    39. override fun giveDolls() {
    40. run{
    41. pursuit ?: Pursuit("小明")
    42. }.giveDolls()
    43. print("给$pursuedName")
    44. println()
    45. }
    46. }
    47. fun main() {
    48. //真实追求者小明
    49. val pursuit = Pursuit("小明")
    50. val proxyZhangSan = Proxy("小红")
    51. proxyZhangSan.pursuit = pursuit
    52. proxyZhangSan.giveDolls()
    53. proxyZhangSan.giveFlowers()
    54. proxyZhangSan.giveChocolate()
    55. }

    五、动态代理

    Java静态代理和动态代理_AllenC6的博客-CSDN博客Java动态代理原理:1.这个动态代理对象是什么,为什么能强转成那些传入的Proxy.newProxyInstance中的第二个参数的接口2.怎么实现的一调用我们传入Proxy.newProxyInstance中的第二个参数中接口中的方法,就会触发InvocationHandler的invoke方法,并且把调用的那个方法的Method和参数传过来。https://blog.csdn.net/m0_37707561/article/details/121566748

  • 相关阅读:
    vue3全局自定义指令实现按钮权限控制
    采用创新的FPGA 器件来实现更经济且更高能效的大模型推理解决方案
    内网渗透系列之mimikatz的使用以及后门植入
    随手记:uniapp图片展示,剩余的堆叠
    验证一个小小的问题
    【论文阅读】Extract Free Dense Labels from CLIP
    【C++学习第六讲】第一章练习题(含源代码)
    FastAPI 库(Python 的 Web 框架)基本使用指南(一)
    JavaSE基础1
    前端秘法基础式终章----欢迎来到JS的世界
  • 原文地址:https://blog.csdn.net/m0_37707561/article/details/126284668
  • 最新文章
  • 【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
    SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
    不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
    Halo插件:支持GitHub的图床附件策略
    电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
    华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
    软件更好写之后口碑会更重要
    大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
    Java标签跳转:一个鲜为人知但却很实用的小技巧
    多智能体系统论文速读
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号