设计模式-委托模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 委托模式在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 {@Overridepublic 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):passclass ConcreteDelegate(Delegate):def execute(self):print("执行委托方法")class Proxy:def __init__(self):self.delegate = Nonedef setDelegate(self, delegate):self.delegate = delegatedef 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.mzph.cn/news/628330.shtml

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

相关文章

css深度选择器 /deep/

一、/deep/的含义和使用 /deep/ 是一种 CSS 深度选择器,也被称为深度组合器或者阴影穿透组合器,主要用在 Web 组件样式封装中。 在 Vue.js 或者 Angular 中,使用了样式封装技术使得组件的样式不会影响到全局,也就是说组件内部的…

白码CRM快速实现报价转订单功能

某crm项目已经做到销售模块了,销售模块实现了从报价到销售单,再到财务模块的应收流程。但使用过程中发现不好用的地方:报价通过后客户下单,销售相关人员又要重新录入数据一样的销售单,觉得这样的操作比较繁琐&#xff…

【STM32】HAL库的STOP低功耗模式UART串口唤醒,第一个接收字节出错的问题(已解决)

【STM32】HAL库的STOP低功耗模式UART串口唤醒,第一个接收字节出错的问题(已解决) 文章目录 BUG复现调试代码推测原因及改进方案尝试中断时钟供电外设唤醒方式校验码硬件问题 切换到STOP0模式尝试结论和猜想解决方案附录:Cortex-M…

说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系

Kubernetes v1.20版本 的 release note 里说 deprecated docker。并且在后续版本 v1.24 正式删除了 dockershim 组件,这对我们有什么影响呢?Kubernetes 1.20: The Raddest Release | Kubernetes 为了搞明白这件事情,以及理解一系列容器名词 …

仿真机器人-深度学习CV和激光雷达感知(项目2)day01【项目介绍与环境搭建】

文章目录 前言项目介绍功能与技术简介硬件要求环境配置虚拟机运行项目demo 前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫本文内容是我为复试准备的第二个项目 💫欢迎大家的关注,我的博客主要关注…

03.neuvector之组的划分逻辑

neuvector之组的划分逻辑 原文链接,欢迎大家关注我的github账号 一、组的定义 NeuVector 会自动从正在运行的应用程序中创建组。这些组以前缀‘nv‘开头。您也可以使用 CRD 或 REST API 手动添加它们,并且可以在任何模式下创建、发现、监视或保护。网络和响应规则需…

现阶段Python和Java哪个更吃香?

现阶段Python和Java哪个更吃香? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&…

论文阅读 Vision Transformer - VIT

文章目录 1 摘要1.1 核心 2 模型架构2.1 概览2.2 对应CV的特定修改和相关理解 3 代码4 总结 1 摘要 1.1 核心 通过将图像切成patch线形层编码成token特征编码的方法,用transformer的encoder来做图像分类 2 模型架构 2.1 概览 2.2 对应CV的特定修改和相关理解 解…

一个小程序跳转到另一个小程序中如何实现

小程序 保证两个小程序是一样的主体才可以跳转。怎么知道是不是同样的主体呢&#xff1f; 小程序的后台管理-设置-基本设置-基本信息。查看主体信息。 跳转 <button clicktoOtherMini()>跳转到另一个小程序</button> function toOtherMini(){wx.navigateToMini…

GPT实战系列-简单聊聊LangChain搭建本地知识库准备

GPT实战系列-简单聊聊LangChain搭建本地知识库准备 LangChain 是一个开发由语言模型驱动的应用程序的框架&#xff0c;除了和应用程序通过 API 调用&#xff0c; 还会&#xff1a; 数据感知 : 将语言模型连接到其他数据源 具有代理性质 : 允许语言模型与其环境交互 LLM大模型…

smartgit选择30天试用后需要输入可执行文件

突然有一天smartgit提示到期了&#xff0c;我按照以往那样删除license和preferences文件后&#xff0c;选择30天试用&#xff0c;弹出了需要选择git可执行文件。 我尝试选择了我的git.exe&#xff0c;发现根本不行&#xff0c;提示让我执行下git --version 执行过后提示我的.gi…

数据结构及其简单实现

栈 先进后出栈顶操作&#xff08;栈顶进&#xff0c;栈顶出&#xff09; class Strock {constructor() {this.data [] // 可以是对象this.count 0}push(item) {// 实现有三种// 1. this.data.push(item); // 2. this.data[this.data.length] item; this.count// 3this.dat…

CentOS 7 权限管理实战指南:用户组管理相关命令详解

前言 深入了解 CentOS 7 用户组管理的命令&#xff0c;掌握关键的用户组操作技巧。从创建和删除用户组、修改组属性&#xff0c;到设置组密码和管理组成员&#xff0c;这篇文章详细介绍了 CentOS 7 系统下常用的用户组管理命令&#xff0c;为读者小伙伴提供了实用而全面的指南…

Python武器库开发-武器库篇之Whois信息收集模块化(四十五)

Python武器库开发-武器库篇之Whois信息收集模块化(四十五) 我们在进行渗透的时候&#xff0c;需要进行全面的信息收集&#xff0c;除了主动信息收集之外&#xff0c;我们还经常会进行被动信息收集&#xff0c;Whois信息收集就是其中的一种,我们可以利用一些网站进行Whois信息收…

【LabVIEW FPGA入门】没有CompactRIO时进行编程测试

1.新建一个空白项目。 2.新建cRIO终端。 要添加仿真的远程实时目标&#xff0c;请选择项目名称&#xff0c;右击并选择新建>>目标和设备(Targets and Devices)。 3.新建终端和设备&#xff0c;选一个cRIO型号 接下来&#xff0c;当添加目标和设备窗口出现时&#xff0c;请…

虚拟ip可以解决所有的安全问题吗

虚拟IP&#xff08;Virtual IP&#xff09;是一种网络技术&#xff0c;可以把多台物理服务器或设备组合成一个逻辑集群&#xff0c;并且使用同一个IP地址对外提供服务。虚拟IP具有负载均衡、故障切换和高可用性等优势&#xff0c;同时还可以作为一种安全措施来增加系统的抗攻击…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-12+13 不变性原理+非线性系统稳定设计

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-1213 不变性原理非线性系统稳定设计 1. Invariance Princilpe-LaSalle;s Theorem不变性原理2. Nonlinear Basic Feedback Stabilization 非线性系统稳定设计 1. Invarianc…

springCloud使用apache的http类和RestTemplate以及Eureka

使用apache的&#xff1a; package com.csgholding.pvgpsp.eqp.util;import com.esotericsoftware.minlog.Log; import org.apache.commons.collections4.MapUtils; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apac…

强化学习(1)——scratching the surface

李宏毅老师的课件 https://www.bilibili.com/video/BV1XP4y1d7Bk/?spm_id_from333.337.search-card.all.click&vd_sourcee7939b5cb7bc219a05ee9941cd297ade ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9502a795feba46959c56092d5f3…

蓝桥杯练习题(六)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;六&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …