设计模式-委托模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 委托模式与代理模式的区别
    • 代码示例
      • Java实现委托模式
      • Python实现委托模式
    • 委托模式在spring中的应用


模式介绍

委托模式是一种行为模式,用于在面向对象设计中解决多个对象接收并处理同一请求的问题。它通过将请求委托给另一个对象来统一处理请求,提高程序的性能和降低内存空间的使用。

委托模式利用了事件的冒泡机制,将一个或一组元素的事件委托给它们的父层或更外层元素上。真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时,会通过事件冒泡机制触发外层元素的绑定事件,然后在该元素上执行函数。

这种模式的优点在于可以减少重复的代码,提高代码的可重用性和可维护性。同时,它也可以降低系统的耦合度,使系统更加灵活和易于扩展。

与代理模式相比,委托模式更注重结果而非过程。委托模式的核心是静态代理和策略模式的一种特殊组合。委托模式通常在需求中实现,例如商城系统和礼物系统需求,程序员可以通过委托模式将任务委派给其他对象处理,从而提高程序的可扩展性和灵活性。

在这里插入图片描述

模式特点

委托模式的优点主要包括:

  1. 解耦:委托模式有助于减少对象间的耦合度,使得对象之间的关系更加清晰和简单。
  2. 灵活性:通过委托,可以将一个任务的执行委派给其他对象,这使得程序更加灵活,便于进行功能扩展和维护。
  3. 复用性:通过将类似的任务委派给相同的对象处理,可以避免代码的重复,提高代码的复用性。
  4. 集中处理:可以将分散的任务集中处理,便于进行任务管理和任务调度。

委托模式的缺点主要包括:

  1. 性能影响:由于需要额外进行委托操作,可能会对性能产生一定影响。
  2. 过度依赖:如果过度使用委托模式,可能会导致代码结构变得复杂,增加维护的难度。
  3. 安全性问题:如果对委托的对象没有进行合适的检查和验证,可能会引入安全风险。
  4. 可能产生循环依赖:在某些情况下,委托可能会产生循环依赖的问题,使得程序难以理解和维护。

在这里插入图片描述

应用场景

委托模式在编程中有许多应用场景,以下是其中几个具体的例子:

  1. 事件处理:在图形用户界面(GUI)编程中,事件处理是一个常见的应用场景。当用户与界面进行交互(如点击按钮、输入文本等)时,可以触发相应的事件。通过委托模式,可以将这些事件的处理逻辑委托给特定的方法或函数,从而实现事件与处理逻辑的解耦。
  2. 回调函数:委托模式也常用于实现回调函数。在某些情况下,需要将一个任务的执行结果通知给另一个对象。通过委托模式,可以将回调函数作为参数传递给任务执行方法,在任务完成后调用回调函数,从而将结果通知给相应的对象。
  3. 多线程编程:在多线程编程中,委托模式可以用于实现线程之间的通信和协作。例如,可以将一个线程中的任务委托给另一个线程来处理,或者通过委托模式实现线程之间的数据共享和同步。
  4. 插件系统:在开发插件系统时,委托模式可以用于实现插件之间的解耦和扩展性。通过将插件的功能以委托的形式暴露出来,主程序可以在运行时动态地加载和卸载插件,从而实现功能的扩展和定制。

具体到代码层面,比如在C#中,可以使用委托(delegate)来实现委托模式。委托类型定义了可以引用的方法的类型,可以将方法作为参数传递给其他方法,或者将方法赋值给变量,以便稍后调用。这使得委托模式在C#中广泛应用于事件处理、回调函数、多线程编程等场景。

以上内容仅供参考,如需更多信息,建议查阅相关文献或咨询编程专家。

在这里插入图片描述

委托模式与代理模式的区别

委托模式与代理模式在多个方面存在差异:

  1. 行使权利的名义:代理包括委托代理、法定代理、指定代理三种类型,其中法定代理和指定代理是由法律规定的,而委托则是在双方诚信的基础上,通过合同的方式确定的民事法律活动。
  2. 从事的事务:代理涉及的行为以意思表示为要素,因此代理的一定是民事法律行为。而委托不要求以“意思表示”为要素,因此委托从事的行为可以是纯粹的事务性行为。
  3. 涉及的当事人:代理涉及三方当事人,即被代理人、代理人、第三人。而委托则属于双方当事人之间的关系,即委托人、受托人。
  4. 法律约束力:代理关系的法律效力与三方有关,而委托合同与代理关系不同,其法律约束力仅限于委托人和受托人,与第三人无关。
  5. 实现功能:从实现功能上讲,代理是提供一种“一个类对另外一个类的控制权”,是类与类之间关系。委托提供了“一种方法的执行会同时执行加载在上面的方法”,是方法与方法之间的关系。
  6. 执行方法:委托对象所加载的方法不一定要属于同一个类,但代理的类必须属于同一个类。

总的来说,委托模式与代理模式各有特点,在实际应用中应根据具体情况选择合适的方式。

在这里插入图片描述

代码示例

Java实现委托模式

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

// 定义委托接口
interface Delegate {void execute();
}// 实现委托接口的类
class ConcreteDelegate implements Delegate {@Overridepublic void execute() {System.out.println("ConcreteDelegate.execute()");}
}// 委托接收者类
class Receiver {private Delegate delegate;public void setDelegate(Delegate delegate) {this.delegate = delegate;}public void action() {delegate.execute();}
}// 委托调用者类
class Invoker {private Receiver receiver;public Invoker(Receiver receiver) {this.receiver = receiver;}public void setDelegate(Delegate delegate) {receiver.setDelegate(delegate);}public void execute() {receiver.action();}
}// 测试代码
public class Main {public static void main(String[] args) {Receiver receiver = new Receiver();Invoker invoker = new Invoker(receiver);ConcreteDelegate concreteDelegate = new ConcreteDelegate();invoker.setDelegate(concreteDelegate); // 设置委托接收者对象中的委托对象为ConcreteDelegate对象invoker.execute(); // 执行委托调用者对象的execute方法,间接执行了ConcreteDelegate对象的execute方法,实现了委托模式的功能。}
}

在上述代码中,通过定义Delegate接口和ConcreteDelegate类来实现委托模式。Receiver类作为委托接收者,Invoker类作为委托调用者。在Invoker类中,通过调用Receiver类的setDelegate()方法来设置委托对象,然后通过调用execute()方法来执行委托调用者对象的操作,间接执行了委托对象的操作,实现了委托模式的功能。

Python实现委托模式

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

class Delegate:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):return self.func(*args, **kwargs)class Receiver:def __init__(self):self.delegate = Nonedef set_delegate(self, delegate):self.delegate = delegatedef action(self):if self.delegate:self.delegate()class Invoker:def __init__(self, receiver):self.receiver = receiverdef set_delegate(self, delegate):self.receiver.set_delegate(delegate)def execute(self):self.receiver.action()def concrete_delegate():print("ConcreteDelegate.execute()")# 测试代码
receiver = Receiver()
invoker = Invoker(receiver)
invoker.set_delegate(Delegate(concrete_delegate))  # 设置委托接收者对象中的委托函数为concrete_delegate函数
invoker.execute()  # 执行委托调用者对象的execute方法,间接执行了concrete_delegate函数,实现了委托模式的功能。

在上述代码中,Delegate类是一个代理类,它接受一个函数作为参数,并将其存储在func属性中。__call__方法允许代理对象像函数一样被调用。Receiver类作为委托接收者,Invoker类作为委托调用者。在Invoker类中,通过调用Receiver类的set_delegate()方法来设置委托函数,然后通过调用execute()方法来执行委托调用者对象的操作,间接执行了委托函数,实现了委托模式的功能。

在这里插入图片描述

委托模式在spring中的应用

在Spring框架中,委托模式有多种应用场景,以下是其中几个例子:

  1. 监听器(Listener):Spring中的监听器,比如ApplicationListener,就是一个典型的委托模式的应用。在各个阶段发布事件,Spring会调用相应的监听器,这就是一个委派的过程。
  2. 代理模式:Spring的AOP(面向切面编程)就是一种特殊的代理模式,它允许程序员定义“切面”,在方法的调用之前、之后或者抛出异常的时候执行特定的代码。
  3. 模板模式:在Spring的JdbcTemplate中,execute()方法就是模板模式的一个应用。子类只需要实现具体的步骤,而不需要关心整体的流程。
  4. 策略模式:在Spring实例化对象的时候,可能会用到策略模式。例如,用户可以选择使用不同的算法解决同一个问题,这可以通过策略模式实现。
  5. 委派模式:SpringMVC框架中的DispatcherServlet实际上就使用了委派模式。它负责任务的调用和分配,类似于全权代理。

在这里插入图片描述

设计模式-注册模式

设计模式-外观模式

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

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

相关文章

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin 在 Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin-CSDN博客 基础上,这次使用ScaleGestureDetector检测两根手指的缩放动作&a…

Dubbo源码解析第一期:如何使用Netty4构建RPC

一、背景 早期学习和使用Dubbo的时候(那时候Dubbo还没成为Apache顶级项目),写过一些源码解读,但随着Dubbo发生了翻天覆地的变化,那些文章早已过时,所以现在计划针对最新的Apache Dubbo源码来进行“阅读理解…

插件化/热修复

1、如何规避Android P对私有API的访问限制 ● Android:Pie — 9.0 — 28 ● 一般都是通过反射访问私有 API 1.1、私有API Android源码查看网址 (1)hide public hide public方法无法直接使用,可以自行编译系统源码&#xff0c…

【Visual Object Tracking】Learning notes

Dense Optical Tracking: Connecting the Dots 参考学习来自: 单目标跟踪 Siamese系列网络:SiamFC、SiamRPN、one-shot跟踪、one-shotting单样本学习、DaSiamRPN、SiamRPN、SiamMask 单目标跟踪:跟踪效果 / 单目标跟踪:数据集处…

Python入门(一)

anaconda安装 官网:https://www.anaconda.com下载 jupyter lab 简介: 包含了Jupyter Notebook所有功能。 JupyterLab作为一种基于web的集成开发环境,你可以使用它编写notebook,操作终端,编辑markdown文本&#xf…

前端使用css去除input框的默认样式

关键点&#xff1a; /* 关键点&#xff0c;让输入框无边框 */outline:none; border:none; 1.效果图 2.html <div class"container"><input type"text" placeholder"请输入用户名"><input type"text" placeholder&q…

揭秘安全测试--一起学习吧之安全测试

笔者最近又有个迭代要上线了~正处于安全测试阶段&#xff0c;今天想和大家一起谈谈安全测试相关的知识。 安全测试是指对应用程序存在的安全问题进行测试&#xff0c;目的是防止意外或者恶意对应用程序进行攻击。安全测试分为安全功能测试和安全渗透测试&#xff0c;其中安全功…

Qt 多次绘图

使用Qt 的时候发现&#xff1a; 背景&#xff1a;自己定义一个类&#xff0c;把它和某个ui文件绑定。(类似 Qt creator 默认创建的工程&#xff09;问题&#xff1a;当鼠标在窗口内单击的时候会触发2次绘图。&#xff1f;难道不应该是一次吗&#xff1f; 于是开始了如下的测试…

STM32 freertos 使用软件模拟串口uart

如题&#xff0c;为什么要这样做&#xff1f; 最近做的一个项目上使用了74HC595作为指示灯板使用&#xff1b; 这个灯板与驱动板是通过排线连接&#xff0c;排线约25cm长&#xff1b; 在实验室测试一切正常&#xff0c;发到客户手上使用就出现了某个LED跳动情况&#xff1b;…

【6】密评中对服务端采用“挑战-响应”机制进行身份鉴别的验证

对服务端采用“挑战-响应”机制进行身份鉴别的验证 1、提取出服务端的签名值 签名值&#xff08;hex&#xff09;&#xff1a; 3045022100e4795b5a947526f8e7cbd0edd571ea8749e0efd24323799346ea2c740c006c5a0220026189e51c19d20d40a82606d0ed72cb9530a189bbb94c09e4559d7d8f…

人工智能 | 自然语言处理的发展历程

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 自然语言处理的发展 方向一&#xff1a;技术进步1. 基于规则的语法&#xff08;1950-1990&#xff09;2. 统计语言处理&#xff08;1990-2010&#xff09;3. 基于深度学…

QSqlQuery 执行Update 判断执行成功与否

1.执行更新操作的SQL语句 update s_info set name"009" where contact_number "13511112222" 怎么样判断是否确实更新操作是执行成功的 &#xff0c;可以通过下列语句判断 query.numRowsAffected() > 0 2.主要的几步操作如下: QSqlQuery query;query.…