委派(委托)模式

简介

委派模式(Delegate Pattern)又叫作委托模式,是一种面向对象的设计模式,允许对象组合实现与继承相同的代码重用。它的基本作用就是负责任务的调用和分配,是一种特殊的静态代理模式,可以理解为全权代理模式,但是代理模式注重过程,而委派模式注重结果。委派模式属于行为型设计模式,不属于GoF的23种设计模式。

通用模板

  1. 创建抽象任务角色:定义一个抽象接口,它有若干实现类。

    // 抽象任务角色
    public interface ITask {void doTask();
    }
    
  2. 创建具体任务角色:真正执行任务的角色。

    // 具体任务A
    public class ConcreteTaskA implements ITask {@Overridepublic void doTask() {System.out.println("任务由A执行");}
    }
    
    // 具体任务B
    public class ConcreteTaskB implements ITask {@Overridepublic void doTask() {System.out.println("任务由B执行");}
    }
    
  3. 创建委派者角色:负责在各个具体角色实例之间做出决策,判断并调用具体实现的方法。

    import java.util.Random;// 委派者角色
    public class Delegate implements ITask {@Overridepublic void doTask() {System.out.println("委派者开始委派任务");ITask task;if (new Random().nextBoolean()) {task = new ConcreteTaskA();task.doTask();} else {task = new ConcreteTaskB();task.doTask();}System.out.println("委派者执行完毕");}
    }
    

模板测试

  1. 测试代码

    public class Client {public static void main(String[] args) {new Delegate().doTask();}
    }
    
  2. 结果

    委派者开始委派任务
    任务由A执行
    委派者执行完毕
    

应用场景

现实生活中,常有委派模式的场景发生,例如,老板给项目经理下达任务,项目经理会根据实际情况给每个员工都分配工作任务,待员工把工作任务完成之后,再由项目经理向老板汇报工作进度和结果。再比如,我们经常写授权委托书,授权他人代办事务。
委派模式适用于以下应用场景。
(1)需要实现表现层和业务层之间的松耦合。
(2)需要编排多个服务之间的调用。
(3)需要封装一层服务查找和调用。

优点

通过任务委派能够将一个大型任务细化,然后通过统一管理这些子任务的完成情况实现任务的跟进,加快任务执行的效率。

缺点

任务委派方式需要根据任务的复杂程度进行不同的改变,在任务比较复杂的情况下,可能需要进行多重委派,容易造成紊乱。

“生搬硬套”实战

场景描述

老板给项目经理下达任务,项目经理会根据实际情况给每个员工都分配工作任务,待员工把工作任务完成之后,再由项目经理向老板汇报工作进度和结果。

代码开发
  1. 创建抽象任务角色(这里指的是员工统一接口)

    // 员工接口
    public interface IEmployee {void doing(String task);
    }
    
  2. 创建具体任务角色(这里只具体的员工)

    // 员工A
    public class EmployeeA implements IEmployee {String goodAt = "编程";@Overridepublic void doing(String task) {System.out.println("我是员工A,我擅长" + goodAt + ",现在开始做" + task + "工作");}
    }
    
    // 员工B
    public class EmployeeB implements IEmployee {String goodAt = "平面设计";@Overridepublic void doing(String task) {System.out.println("我是员工B,我擅长" + goodAt + ",现在开始做" + task + "工作");}
    }
    
  3. 创建委派者角色(委派者就是项目经理,这里加入一个Boss类给项目经理发排活,而项目经理作为委派者,给不同员工派活)

    // 委派者:项目经理类
    public class Leader implements IEmployee {private Map<String, IEmployee> employee = new HashMap<>();public Leader() {employee.put("爬虫", new EmployeeA());employee.put("海报图", new EmployeeB());}@Overridepublic void doing(String task) {if (!employee.containsKey(task)) {System.out.println("这个任务"+task+"超出我的能力范围了");return;}employee.get(task).doing(task);}}
    // 老板
    public class Boss {public void command(String task, Leader leader) {leader.doing(task);}
    }
    

至此,我们就通过“生搬硬套”委派者模式的模板设计出一套老板委派项目经理给员工派活的逻辑,接下来我们进行测试:

  • 测试代码

    public class Client {public static void main(String[] args) {new Boss().command("爬虫",new Leader());new Boss().command("海报图",new Leader());new Boss().command("买手机",new Leader());}
    }
    
  • 结果

    我是员工A,我擅长编程,现在开始做爬虫工作
    我是员工B,我擅长平面设计,现在开始做海报图工作
    这个任务买手机超出我的能力范围了
    

总结

委派模式是一种设计模式,其中一个对象(委派人)将任务委托给另一个对象(受托人)来执行。委派人和受托人之间通常是通过接口或抽象类联系起来的,委派人通过持有受托人的引用,将任务交给受托人处理。

特点

  • 责任转移:委派人将部分或全部职责转移给受托人。
  • 松耦合:委派人和受托人之间通过接口通信,而不是直接调用实现。
  • 灵活性:委派人和受托人可以独立地扩展,不会互相影响。
  • 多态性:委派人可以调用受托人的方法,而不知道具体是谁在执行。

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

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

相关文章

前端编程艺术(1)---HTML

目录 1.HTML 2.注释 3.标题标签 4.段落标签 5.换行与水平分隔线 6.文本格式化标签 7.图像标签和属性 8.超链接 8.列表标签 9.表格标签 10.表单标签 11.HTML5 1.HTML HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是一种用于创建…

【JAVA开源】基于Vue和SpringBoot的新闻推荐系统

本文项目编号 T 056 &#xff0c;文末自助获取源码 \color{red}{T056&#xff0c;文末自助获取源码} T056&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

Node-RED系列教程-23node-red获取OPCDAServer数据(DCOM配置)

准备了一个干净的windows 2016虚拟机: administrator wong@123 以管理员身份进入系统: 准备好如下软件: 使用的nodejs版本为: 设置淘宝镜像源: npm config set registry https://registry.npmmirror.com 安装nodered: npm install -g --unsafe-perm node-red@2.2.2

如何组织鼠标的默认的事件

如何组织鼠标的默认的事件 我原先的代码是 dblclick"checkNode(data)"设置了一个双击的事件&#xff0c;我如果双击的话就会导致这个内容被选中。 选中内容的同时会触发浏览器默认的操作&#xff0c;导致出现复制的框这些东西。 解决的方法。加一句。 mousedown.pr…

Power apps:一次提交多项申请

1、添加一个Form&#xff0c;导入sharepoint列表&#xff0c;添加确认&#xff0c;继续&#xff0c;取消按钮 2、在页面的onvisible属性中添加 Set(applynumber,Last(付款申请表).申请编号1); #定义一个申请编号变量&#xff0c;每次申请&#xff0c;就将列表最后一个…

2024上海网站建设公司哪家比较好TOP3

判断一家网建公司的好坏&#xff0c;第一是看公司背景&#xff0c;包括成立时间&#xff0c;工商注册信息等&#xff0c;第二可以去看看建站公司做的案例&#xff0c;例如&#xff0c;网站开发、设计、引流等等的以往案例&#xff0c;了解清楚具体的业务流程。 一、公司背景 …

让小脚本成为自己高效测试的工具

测试中会遇到的工具 软件测试如果仅仅靠手工去执行会发现在很多地方力不从心&#xff0c;虽然市面上已经有大牛开源了一些测试工具可以供我们使用但是在一些公司特有的业务方面则需要我们借助开源或重新做一个自己的测试工具。 测试常用的开源工具 死链接检测工具 Xenu home…

【羊毛资源】华为云开发者云主机免费申请使用指南

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

SpringAOP实现的两种方式-JDK动态代理和CGLIB动态代理

前言 想要了解SpringAOP的实现方式&#xff0c;需要先了解什么是AOP OOP和AOP的区别 OOP 面向对象&#xff0c;允许开发者定义纵向的关系&#xff0c;但并适用于定义横向的关系&#xff0c;导致了大量代码的重复&#xff0c;而不利于各个模块的重用。 AOP&#xff0c;一般称为…

解决Cloudflare 521错误的四种方法

在使用Cloudflare进行网站加速时&#xff0c;错误521是一个常见的问题&#xff0c;表示“Web服务器关闭”。当你访问某个使用Cloudflare的网站时&#xff0c;如果原始服务器拒绝了Cloudflare的连接请求&#xff0c;浏览器就会显示此错误信息。本文将详细介绍导致错误521的原因&…

如何将list嵌套的list的[]去掉

如果list里里面的元素是数字&#xff0c;‘1’也是可以的&#xff0c;那么我们可以使用np.ravel a [[1,2,3], [5, 2, 8], [7,8,9]]list(np.ravel(a)) #[1, 2, 3, 5, 2, 8, 7, 8, 9]对于不规则List c[[‘云阳站’], [‘双江’, ‘木古’], [‘滨双线’], [‘滨双线’, ‘云田线…

CRM在客户生命周期管理中的高效应用

企业要想在市场中持续增长并脱颖而出&#xff0c;就必须深刻理解并有效管理客户生命周期。客户生命周期&#xff0c;简而言之&#xff0c;是指从客户首次接触企业到最终与企业关系终止的全过程&#xff0c;它涵盖了多个关键阶段&#xff0c;每个阶段都蕴含着不同的机遇与挑战。…

无线领夹麦克风哪个牌子好?2024年口碑最好的领夹麦克风品牌推荐

举国同庆的国庆节快要到了&#xff0c;相信不少朋友都想趁此机会多拍摄一些Vlog来记录美好节日&#xff0c;想要音质效果好&#xff0c;领夹麦克风少不了&#xff01;但是无线领夹麦克风行业看似繁荣的背后&#xff0c;却隐藏着一些不为人知的黑幕。从夸大信号稳定性到忽视音质…

0代码、自动化,让AI视觉算法赋能千行百业(含源代码)

AI视频卫士通过自动化机器学习技术&#xff0c;降低AI开发和训练的门槛&#xff0c;让更多行业能够轻松接入AI&#xff0c;解决实际问题。 例如一个不懂AI的产品经理&#xff0c;但是他知道他想要能够检测到垃圾桶是否装满溢出&#xff0c;那么他只需要上传垃圾桶装垃圾溢的场景…

LangChain进阶技巧:提高聊天机器人性能的策略[第三课]

LangChain应运而生&#xff0c;为开发者们提供了一种高效、便捷的工具&#xff0c;助力他们构建出功能强大的大型语言模型应用。本文将带您走进LangChain的世界&#xff0c;揭秘其背后的技术原理&#xff0c;探讨如何利用这一利器来拓展语言模型的无限可能。通过丰富的实例分析…

“DNA亲和纯化测序:汇智生物的精准分析“

&#x1f331; 汇智生物 | 专注农业&植物基因组分析 &#x1f331; &#x1f393; 教授【优青】团队亲自指导&#xff01;提供专业实验设计、数据分析、SCI论文辅助等全方位服务。精准高效&#xff0c;为农植物科研保驾护航&#xff01; &#x1f52c; 专业实验外包服务&am…

正点原子阿波罗STM32F429IGT6移植zephyr rtos(二)---使用I2C驱动MPU6050

硬件平台&#xff1a;正点原子阿波罗STM32F429IGT6 zephyr版本&#xff1a;Zephyr version 3.7.99 开发环境&#xff1a;ubuntu 24.4 zephyr驱动开发与之前接触到的开发方式可能都不一样&#xff0c;更像是linux驱动开发&#xff0c;zephyr源码里边其实已经有写好的I2C和MPU60…

ST-GCN模型实现花样滑冰动作分类

加入深度实战社区:www.zzgcz.com&#xff0c;免费学习所有深度学习实战项目。 1. 项目简介 本项目实现了A042-ST-GCN模型&#xff0c;用于对花样滑冰动作进行分类。花样滑冰作为一项融合了舞蹈与竞技的运动&#xff0c;其复杂的动作结构和多变的运动轨迹使得动作识别成为一个具…

CRM如何实现对客户信息的全局管理?

在知识产权与科技服务领域中&#xff0c;企业如何精准把握客户需求&#xff0c;高效管理知识产权资产&#xff0c;成为了决定其竞争力的关键因素。传统的CRM虽在一定程度上提升了客户管理效率&#xff0c;但在面对知识产权这一复杂且多变的领域时&#xff0c;往往显得力不从心。…

Html jquery下拉select美化插件——selectFilter.js

1. Html jquery下拉select美化插件——selectFilter.js jQuery是一个广泛使用的JavaScript库&#xff0c;它简化了DOM操作、事件处理、动画以及Ajax交互&#xff0c;使得开发者能更高效地构建交互式网页。在本案例中&#xff0c;jquery.selectlist.js插件正是基于jQuery构建的&…