设计模式-委托模式

news2024/10/6 10:33:45
设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 委托模式在GUI编程场景的应用
    • 代码示例
      • Java实现委托模式
      • Python实现委托模式
    • 委托模式在spring中的应用


模式介绍

委托模式是一种软件设计模式,其中一个对象(委托对象)将某些操作委托给另一个对象(委托方法)进行处理。这种模式的核心思想是将复杂的功能分解到不同的对象中去实现,降低单个对象的复杂度,从而提高系统的可维护性和可扩展性。

在委托模式中,接受请求的对象将请求委托给另一个对象来处理,类似于回调函数的机制。委托模式通过降低单个对象的复杂度来提高系统的可维护性和可扩展性。委托模式广泛应用于事件驱动编程、GUI编程、多线程编程等领域。

在实际应用中,委托模式具有广泛的应用场景。例如,在UI界面中,可以将按钮点击事件视为一个事件,而执行该操作的方法视为一个事件处理器。通过使用委托模式的思路,可以将事件处理器通过委托的形式注册到事件中心。当事件发生时,事件中心会调用所有已注册的事件处理器,以执行所需的操作。在这个例子中,事件就是委托对象,事件处理器就是委托方法。

此外,委托模式还可以利用事件的冒泡机制将一个或一组元素的事件委托到其父层或更外层元素上。这种机制可以减少内存空间的使用,提高程序性能。例如,在HTML文档中,可以在某个祖先元素上注册一个事件,管理其所有后代元素上同一类型的事件。

在这里插入图片描述

模式特点

  • 委托模式的优点包括:
  1. 降低耦合度:委托模式使得原本紧密耦合的对象可以解耦,从而提高了代码的可维护性和可复用性。
  2. 灵活性和可扩展性:通过使用委托模式,可以将复杂的操作分解为一系列简单的步骤,每个步骤由单独的类来处理。这使得在不影响其他部分的情况下添加新功能或修改现有功能变得更容易。
  3. 增强功能复用:委托模式使得某些方法可以被多个委托所共享,从而实现功能的复用。
  4. 更好的分工合作:在大型项目中,使用委托模式可以实现更精细的分工合作,使得不同的开发人员专注于不同的部分,提高开发效率。
  • 委托模式也存在一些缺点:
  1. 可能增加代码复杂性:委托模式需要引入额外的类和接口,这可能会增加代码的复杂性。对于不熟悉委托模式的开发者来说,理解和维护这样的代码可能需要额外的时间和精力。
  2. 性能开销:由于委托模式涉及多个对象的调用和转发,相对于直接调用方法,可能会引入一定的性能开销。
  3. 过度使用可能导致滥用:如果过度使用委托模式,可能会导致代码过于复杂和混乱。在某些情况下,简单的直接调用可能比使用委托模式更为简洁和高效。
  4. 可能引入安全风险:如果委托对象被恶意利用,可能会对系统安全造成威胁。因此,在使用委托模式时,需要确保委托对象的安全性和可信度。

委托模式是一种强大而灵活的设计模式,适用于解决复杂的问题和实现灵活的系统设计。然而,在使用委托模式时,也需要谨慎考虑其优缺点,避免过度使用或滥用。

在这里插入图片描述

应用场景

委托模式的应用场景主要涉及一个对象代表另一个对象和程序中的其他对象进行交互的情况。

在具体的编程场景中,委托模式适用于多种场景。以下是一些具体的示例:

  1. 事件驱动编程:在事件驱动的编程环境中,委托模式可以用于处理各种事件。例如,在GUI编程中,可以将按钮点击事件视为一个事件,而执行该操作的方法视为一个事件处理器。通过使用委托模式的思路,可以将事件处理器通过委托的形式注册到事件中心。当事件发生时,事件中心会调用所有已注册的事件处理器,以执行所需的操作。
  2. 回调函数机制:委托模式类似于回调函数的机制。在需要将某个操作的执行委托给另一个对象时,可以使用委托模式。例如,在网络请求中,可以使用委托模式将数据请求的响应结果委托给相应的处理方法进行处理。
  3. 多线程编程:在多线程编程中,委托模式可以用于将任务分发给不同的线程执行。通过使用委托模式,可以将任务的执行委托给一个独立的线程,使得主线程可以继续执行其他任务。
  4. 分发系统:委托模式适用于构建分发系统,例如任务调度、消息队列等。在这种场景下,可以将任务的分发和处理委托给不同的处理单元进行处理,从而提高系统的并发性能和吞吐量。

委托模式适用于需要将某个操作的执行委托给另一个对象的情况。通过使用委托模式,可以将复杂的操作分解为一系列简单的步骤,降低单个对象的复杂度,提高系统的可维护性和可扩展性。

在这里插入图片描述

委托模式在GUI编程场景的应用

在GUI编程场景中,委托模式可以用于处理各种事件,例如按钮点击、窗口关闭等。以下是一个简单的例子:

假设有一个GUI程序,它有一个主线程负责渲染用户界面和响应用户交互,还有一个后台线程负责处理耗时的任务。在这种情况下,后台线程可能需要在完成任务时通知主线程,更新UI或显示消息。这时,我们就可以使用委托模式来实现这一目的。

具体来说,我们可以在主线程中定义一个委托,并在后台线程中调用该委托来传递消息或执行任务。这样,我们就可以在不同的线程之间安全地传递消息或执行任务,而不会出现线程安全问题。

在这里插入图片描述

代码示例

Java实现委托模式

委托模式在Java中通常通过接口和回调函数来实现。以下是一个简单的Java示例,展示了如何使用委托模式:

// 定义委托接口
interface Delegate {
    void execute();
}

// 委托实现类
class ConcreteDelegate implements Delegate {
    @Override
    public void execute() {
        System.out.println("执行委托方法");
    }
}

// 委托接收者
class Proxy {
    private Delegate delegate;

    public Proxy(Delegate delegate) {
        this.delegate = delegate;
    }

    public void setDelegate(Delegate delegate) {
        this.delegate = delegate;
    }

    public void execute() {
        delegate.execute();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建委托实例
        Delegate delegate = new ConcreteDelegate();
        // 创建委托接收者实例并设置委托实例
        Proxy proxy = new Proxy(delegate);
        // 调用委托接收者的execute方法,实际上会执行委托方法
        proxy.execute();
    }
}

在这个例子中,Delegate 是一个接口,定义了委托方法的契约。ConcreteDelegate 是实现了 Delegate 接口的具体类。Proxy 类持有对 Delegate 的引用,并代理对 execute 方法的调用。客户端代码创建了 DelegateProxy 的实例,并调用了 Proxyexecute 方法,实际上执行的是 Delegateexecute 方法。这就是委托模式的一个简单实现。

Python实现委托模式

委托模式在Python中可以通过类和函数实现。以下是一个Python实现委托模式的示例:

class Delegate:
    def execute(self):
        pass

class ConcreteDelegate(Delegate):
    def execute(self):
        print("执行委托方法")

class Proxy:
    def __init__(self):
        self.delegate = None

    def setDelegate(self, delegate):
        self.delegate = delegate

    def execute(self):
        if self.delegate is not None:
            self.delegate.execute()

# 客户端代码
if __name__ == "__main__":
    # 创建委托实例
    delegate = ConcreteDelegate()
    # 创建委托接收者实例并设置委托实例
    proxy = Proxy()
    proxy.setDelegate(delegate)
    # 调用委托接收者的execute方法,实际上会执行委托方法
    proxy.execute()

在这个例子中,我们定义了Delegate类作为委托接口,ConcreteDelegate类作为实现了委托接口的具体类。Proxy类持有对委托的引用,并代理对execute方法的调用。客户端代码创建了委托实例和委托接收者实例,并通过设置委托接收者的委托属性来指定具体的委托对象。然后,客户端调用委托接收者的execute方法,实际上执行的是委托对象的execute方法。这就是委托模式的一个简单实现。

在这里插入图片描述

委托模式在spring中的应用

委托模式在Spring框架中有着广泛的应用,尤其是在处理事件和回调函数时。以下是一些Spring中应用委托模式的示例:

  1. 事件监听器:Spring的事件监听器机制就是一个典型的委托模式的例子。在Spring中,你可以定义一个事件监听器接口,然后实现该接口的具体类来处理不同的事件。通过将事件处理委托给这些监听器,你可以灵活地添加或删除事件处理逻辑,而不需要修改原有代码。
  2. AOP(面向切面编程):AOP允许开发者定义跨多个应用点的通用逻辑,而无需复制和粘贴代码。在Spring AOP中,通过代理模式和代理对象的回调机制,实现了将横切关注点(如日志、事务管理等)从业务逻辑中分离出来。
  3. Spring的依赖注入:依赖注入是一种将对象之间的依赖关系从硬编码中解耦出来的技术。在Spring中,你可以通过配置文件或注解来指定一个对象的依赖关系,Spring容器会在运行时自动将依赖注入到相应的对象中。这种机制也可以看作是一种委托模式,因为对象之间的依赖关系是由Spring容器来管理的,而不是由对象本身来管理。
  4. Spring的拦截器:拦截器是用于拦截请求或响应的一种机制,常用于实现权限控制、日志记录等功能。在Spring中,你可以定义一个拦截器接口,然后实现该接口的具体类来处理不同的请求或响应。通过将请求或响应的处理委托给这些拦截器,你可以灵活地添加或删除拦截逻辑,而不需要修改原有代码。

以上就是一些Spring中应用委托模式的示例。通过使用委托模式,Spring框架提供了灵活性和可扩展性,使得开发者可以更加高效地构建可维护和可扩展的应用程序。

在这里插入图片描述

设计模式-调停者模式

设计模式-对象池模式

设计模式-状态模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1385621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于如何禁用、暂停或退出OneDrive等操作,看这篇文件就够了

​想知道如何禁用OneDrive?你可以暂停OneDrive的文件同步,退出应用程序,阻止它在启动时打开,或者永远从你的机器上删除该应用程序。我们将向你展示如何在Windows计算机上完成所有这些操作。 如何在Windows上关闭OneDrive 有多种方法可以防止OneDrive在你的电脑上妨碍你。…

护眼灯有蓝光吗?防蓝光护眼台灯推荐

护眼台灯是家长为孩子购买的常见用品之一,但对于它的了解却不够深入,很多人购买之后反而容易出现眼睛疲劳、不适的情况!据了解,主要的原因是因为在选择护眼台灯时,大多数人没有专业知识,没有买到合适的护眼…

Windows10 Docker Desktop安装

一、简介 Docker Desktop是Docker公司推出的一款桌面应用程序,它提供了一个用户友好的界面,方便开发人员在本地环境中使用容器技术。 容器是一种轻量级的虚拟化技术,可以将应用程序和其依赖项打包在一起,形成一个独立、可移植的…

每日一题——LeetCode1200.最小绝对差

方法一 个人方法 排序一次遍历: 最小差值一定是出现在大小相邻的两个元素之间,所以将数组从小到大排序 循环求两元素之间的差值,先假设当前差值为最小差值,先往res数组里面push数据,当碰到更小差值的时候&#xff0c…

acwing BFS

BFS BFS 重点就是要使用 队列 进行每一层的搜索不同题目 队列中保存的元素形式都各不相同,并且也会用到其他辅助结构走迷宫一题,队列中存的是每一层(当前步能走的所有坐标)的坐标,并保存了每一层对应走过的步数八数码一题,队列中…

Android Traceview 定位卡顿问题

Traceview 是一个 Android 性能分析工具,用于时间性能分析,主要帮助开发者了解应用程序中各个方法的执行时间和调用关系。Traceview 可以通过图形化界面查看应用程序的代码执行细节,包括每个方法的调用次数、方法调用的时间消耗、方法调用堆栈…

家政服务小程序搭建,有什么优势?

随着我国社会经济的发展,家政服务成为了每个家庭的一部分。家政服务的种类也逐渐多样,满足了大众日益增加的服务需求。 不过,传统的家政行业以中介为主,雇主在找到适合的家政人员较为麻烦,限制了家政行业的发展&#…

【基于 InternLM 和 LangChain 搭建你的知识库】学习笔记

学习参考文档【基于 InternLM 和 LangChain 搭建你的知识库】 学习参考链接【书生・浦语大模型实战营第三课作业(基础进阶)】 理论 实战 收集原始数据 收集2018年-2020年几年间的优秀数学建模论文 修改脚本文件,测试文件 作业 复现课程知识库助手搭建过程 La…

曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 贝塞尔曲线的应用2 图解贝塞尔曲线3 贝塞尔曲线的性质4 算法仿真4.1 ROS C仿真4.2 Python仿真4.3 Matlab仿真 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法…

CAN工具 - ValueCAN3 - 基础介绍

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”,即可获得canoe入门到精通电子书和INCA软件安装包(不带授权码)下载地址。 CAN/CANFD通讯广泛存在于整个车载网络中,几乎每一块软硬件的开发都需要用到CAN工具&#xff0c…

Open CASCADE学习|创建旋转体

旋转体是一个几何概念,指的是通过旋转一个平面图形得到的立体图形。具体来说,一个平面图形绕着它所在的平面内的一条定直线旋转一周所形成的曲面,这个曲面会围成一个几何体,这个几何体就叫做旋转体。这条定直线被称为旋转体的轴。…

划重点!多微信号一键定时发圈,省时省力!

发朋圈对于很多职场人来说是一种社交媒体营销和个人品牌建设的重要手段。 然而,一个人面对几个微信号的朋友圈,难免会有应付不过来的时候,这时候只需要一个个微管理管理系统,就能帮你一键定时发圈,省去重复发布的时间…

从零开始:生产环境如何部署 Bytebase

Bytebase 是面向研发和 DBA 的数据库 DevOps 和 CI/CD 协同平台。目前 Bytebase 在全球类似开源项目中 GitHub Star 数排名第一且增长最快。 Bytebase 的架构 Bytebase 是一个单体架构 (monolith),前端是 Vue3 TypeScript,后端是 Go。前端利用 Go 1.6 …

说说TCP 3次握⼿和4次握手

三次握手过程 client端建⽴连接,发送⼀个SYN同步包,发送之后状态变成SYN_SENTserver端收到SYN之后,同意建⽴连接,返回⼀个ACK响应,同时也会给client发送⼀个SYN包,发送完成之后状态变为SYN_RCVDclient端收到…

匹配excel表格中两列数据

案例:时间序列D列是打乱的(假的时间序列),那么真正的时间序列G,需要将数值一一匹配。那么要输入公式:VLOOKUP(G2,D$2:E$144,2,FALSE) 其中,G2是一个查询的属性,D$2:E$144是被查询的表…

鸿蒙开发笔记(三):页面和自定义组件生命周期

先明确自定义组件和页面的关系: 自定义组件:Component装饰的UI单元,可以组合多个系统组件实现UI的复用。 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,Entry装饰的自定义组件为页面的入口组件&#xff0c…

Linux网络通信

网络模型 七层模型 四层模型 TCP : 面向连接&#xff0c;可靠的&#xff0c;面向字节流&#xff0c;支持点对点通信。 UDP : 无连接&#xff0c;不可靠&#xff0c;面向数据报文&#xff0c;支持一对一&#xff0c;一对多&#xff0c;多对多。通信原理 常用函数 #include <…

LC 82. 删除排序链表中的重复元素 II

82. 删除排序链表中的重复元素 II 难度&#xff1a; 中等 题目大意&#xff1a; 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 提示&#xff1a; 链表中节点数目在范围 [0, 300] 内-…

GIT SourceTree 回滚提交

步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 在终端输入命令&#xff08;位置是项目目录下&#xff09; git push origin feature_mo2.1_r3_zhanx653 -f

#LLMOps##AIGC# Dify_构建本地知识库问答应用-生成Al应用的创新引擎 用于构建助手API和GPT的开源开发平台

github&#xff1a; https://github.com/langgenius/dify/blob/main/README_CN.md 介绍文档&#xff1a;https://docs.dify.ai/getting-started/readme Dify 介绍 Dify 笔记 Dify 是什么&#xff1f; 开源的大语言模型&#xff08;LLM&#xff09;应用开发平台融合了后端即服…