码农知识堂 - 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

  • 相关阅读:
    【AI学习】Transformer的Token嵌入表示为什么那么长
    Springboot 项目打成jar包部署到服务器中的方式
    Simhash算法及python实现
    Java面试宝典(超级详细)
    企业微信机器人还能这么玩?
    Apache 原生 Hadoop 运维命令
    蓝桥杯(七段码,C++)
    JavaBean处理器之MapStruct
    CEC2013(MATLAB):狐猴优化算法(Lemurs Optimizer,LO)求解CEC2013(提供MATLAB代码及参考文献)
    Baklib帮助中心|如何设置好客户服务帮助您的客户?
  • 原文地址:https://blog.csdn.net/m0_37707561/article/details/126284668
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号