尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

0134_委托模式 (Delegate)

0134_委托模式 (Delegate)
📅 发布时间:2026/6/20 15:45:12

委托模式 (Delegate)

意图

两个对象参与处理同一个请求,接收请求的对象将请求委托给另一个对象来处理。

委托模式的核心思想是:一个对象将某些职责交给另一个专门的对象去完成,从而实现职责的分离和代码的复用。

UML 图

delegate

优点

  1. 职责清晰分离:将具体实现逻辑与调用逻辑分离,每个类专注于自己的职责
  2. 易于扩展和维护:可以轻松添加新的委托实现,而不影响现有代码
  3. 提高代码复用性:多个委托者可以共享同一个委托对象
  4. 灵活性高:可以在运行时动态切换委托对象
  5. 符合开闭原则:对扩展开放,对修改关闭

缺点

  1. 增加系统复杂度:需要创建更多的类和接口
  2. 可能造成过度设计:对于简单场景,使用委托模式可能显得繁琐
  3. 调试难度增加:调用链变长,问题定位可能更困难
  4. 性能开销:多了一层方法调用,可能带来轻微的性能损失

代码示例:人类与机器人任务委托系统

场景描述

在一个智能工厂中,人类主管将不同类型的生产任务委托给** specialized 机器人**去执行。每个机器人专门负责特定类型的任务。

1. 任务接口 (Task Interface)

// 任务接口 - 定义所有机器人需要实现的能力
public interface Task {/*** 执行任务* @param taskDetails 任务详细信息* @return 执行结果*/String execute(String taskDetails);/*** 获取机器人类型*/String getRobotType();/*** 检查是否能够处理该任务*/boolean canHandle(String taskType);
}

2. 具体委托类 (Concrete Delegates)

// 装配机器人 - 专门负责装配任务
public class AssemblyRobot implements Task {private String name;public AssemblyRobot(String name) {this.name = name;}@Overridepublic String execute(String taskDetails) {return String.format("🔧 装配机器人[%s]正在执行装配任务: %s\n" +"   - 精确组装零部件\n" +"   - 质量检测\n" +"   - 完成产品装配", name, taskDetails);}@Overridepublic String getRobotType() {return "装配机器人";}@Overridepublic boolean canHandle(String taskType) {return taskType.contains("装配") || taskType.contains("组装") || taskType.contains("生产");}
}// 运输机器人 - 专门负责物料运输
public class TransportRobot implements Task {private String name;public TransportRobot(String name) {this.name = name;}@Overridepublic String execute(String taskDetails) {return String.format("🚚 运输机器人[%s]正在执行运输任务: %s\n" +"   - 路径规划\n" +"   - 安全运输\n" +"   - 送达目的地", name, taskDetails);}@Overridepublic String getRobotType() {return "运输机器人";}@Overridepublic boolean canHandle(String taskType) {return taskType.contains("运输") || taskType.contains("搬运") || taskType.contains("送达");}
}// 检测机器人 - 专门负责质量检测
public class InspectionRobot implements Task {private String name;public InspectionRobot(String name) {this.name = name;}@Overridepublic String execute(String taskDetails) {return String.format("🔍 检测机器人[%s]正在执行检测任务: %s\n" +"   - 外观检查\n" +"   - 功能测试\n" +"   - 质量评估", name, taskDetails);}@Overridepublic String getRobotType() {return "检测机器人";}@Overridepublic boolean canHandle(String taskType) {return taskType.contains("检测") || taskType.contains("检查") || taskType.contains("测试");}
}// 焊接机器人 - 专门负责焊接任务
public class WeldingRobot implements Task {private String name;public WeldingRobot(String name) {this.name = name;}@Overridepublic String execute(String taskDetails) {return String.format("⚡ 焊接机器人[%s]正在执行焊接任务: %s\n" +"   - 精确定位焊接点\n" +"   - 自动焊接\n" +"   - 焊缝检查", name, taskDetails);}@Overridepublic String getRobotType() {return "焊接机器人";}@Overridepublic boolean canHandle(String taskType) {return taskType.contains("焊接") || taskType.contains("连接");}
}

3. 委托者类 (Delegator)

// 人类主管 - 委托者类
public class HumanSupervisor {private String name;private List<Task> availableRobots;private Task currentDelegate;public HumanSupervisor(String name) {this.name = name;this.availableRobots = new ArrayList<>();initializeRobots();}private void initializeRobots() {availableRobots.add(new AssemblyRobot("装配大师-001"));availableRobots.add(new TransportRobot("迅捷运输-002"));availableRobots.add(new InspectionRobot("精密检测-003"));availableRobots.add(new WeldingRobot("焊接专家-004"));}/*** 委托任务给合适的机器人*/public String delegateTask(String taskType, String taskDetails) {System.out.println(String.format("\n👨‍💼 主管[%s]收到任务: %s - %s", name, taskType, taskDetails));// 寻找合适的机器人Task suitableRobot = findSuitableRobot(taskType);if (suitableRobot == null) {return String.format("❌ 错误: 没有找到能够处理'%s'任务的机器人", taskType);}this.currentDelegate = suitableRobot;System.out.println(String.format("   → 委托给: %s[%s]", suitableRobot.getRobotType(), getRobotName(suitableRobot)));// 执行委托return suitableRobot.execute(taskDetails);}/*** 动态添加新的机器人*/public void addRobot(Task robot) {availableRobots.add(robot);System.out.println(String.format("✅ 新机器人上线: %s[%s]", robot.getRobotType(), getRobotName(robot)));}/*** 显示所有可用的机器人*/public void displayAvailableRobots() {System.out.println(String.format("\n📋 主管[%s]可调度的机器人:", name));for (int i = 0; i < availableRobots.size(); i++) {Task robot = availableRobots.get(i);System.out.println(String.format("   %d. %s - %s", i + 1, robot.getRobotType(), getRobotName(robot)));}}private Task findSuitableRobot(String taskType) {return availableRobots.stream().filter(robot -> robot.canHandle(taskType)).findFirst().orElse(null);}private String getRobotName(Task robot) {// 通过反射获取机器人的name字段(简化实现)try {java.lang.reflect.Field field = robot.getClass().getDeclaredField("name");field.setAccessible(true);return (String) field.get(robot);} catch (Exception e) {return "未知";}}// Getter方法public Task getCurrentDelegate() {return currentDelegate;}public List<Task> getAvailableRobots() {return new ArrayList<>(availableRobots);}
}

4. 客户端代码

public class DelegatePatternDemo {public static void main(String[] args) {System.out.println("=== 委托模式演示 - 人类与机器人任务协作系统 ===\n");// 创建人类主管HumanSupervisor supervisor = new HumanSupervisor("张主管");// 显示可用机器人supervisor.displayAvailableRobots();// 演示任务委托System.out.println("\n" + "=".repeat(50));System.out.println("开始任务委托演示:");System.out.println("=".repeat(50));// 委托装配任务String result1 = supervisor.delegateTask("装配任务", "汽车发动机组装");System.out.println(result1);// 委托运输任务String result2 = supervisor.delegateTask("运输任务", "将原材料运送到生产线A");System.out.println(result2);// 委托检测任务String result3 = supervisor.delegateTask("质量检测", "成品手机功能测试");System.out.println(result3);// 委托焊接任务String result4 = supervisor.delegateTask("焊接任务", "钢结构框架连接");System.out.println(result4);// 演示动态添加新机器人System.out.println("\n" + "=".repeat(50));System.out.println("动态扩展演示:");System.out.println("=".repeat(50));Task newRobot = RobotFactory.createRobot("assembly", "高效装配-005");supervisor.addRobot(newRobot);supervisor.displayAvailableRobots();// 演示无法处理的任务System.out.println("\n" + "=".repeat(50));System.out.println("错误处理演示:");System.out.println("=".repeat(50));String result5 = supervisor.delegateTask("烹饪任务", "制作员工午餐");System.out.println(result5);System.out.println("\n=== 演示完成 ===");// 显示最终的委托关系System.out.println("\n最终委托状态:");System.out.println("当前委托的机器人: " + (supervisor.getCurrentDelegate() != null ? supervisor.getCurrentDelegate().getRobotType() : "无"));}
}

在Spring的应用

在Spring框架中,委托模式被广泛应用:

// Spring中的委托模式示例
@Service
public class OrderProcessingService {// 通过依赖注入委托给不同的处理器@Autowiredprivate List<OrderHandler> orderHandlers;public void processOrder(Order order) {// 委托给合适的处理器OrderHandler suitableHandler = orderHandlers.stream().filter(handler -> handler.canHandle(order.getType())).findFirst().orElseThrow(() -> new RuntimeException("No suitable handler found"));suitableHandler.handle(order);}
}// 处理器接口
public interface OrderHandler {boolean canHandle(OrderType type);void handle(Order order);
}// 具体处理器
@Service
public class OnlineOrderHandler implements OrderHandler {@Overridepublic boolean canHandle(OrderType type) {return type == OrderType.ONLINE;}@Overridepublic void handle(Order order) {// 处理在线订单}
}

总结

委托模式 vs 代理模式:

  • 委托模式:强调职责转移,委托对象真正执行任务
  • 代理模式:强调访问控制,代理对象控制对真实对象的访问

委托模式的核心价值:

  1. 专业分工:每个机器人专注于自己擅长的领域
  2. 灵活调度:人类主管可以根据任务类型动态选择最合适的执行者
  3. 易于扩展:新增机器人类型不影响现有系统
  4. 职责清晰:人类负责决策和调度,机器人负责具体执行

这种模式在现实世界的团队协作、微服务架构、任务调度系统等场景中都有广泛应用,体现了"让专业的人做专业的事"的设计哲学。

相关新闻

  • Java 与智慧农业:智能种植与精准农业实践
  • 课后作业二
  • Postgresql17增量备份demo

最新新闻

  • OpenWRT终极指南:iStore软件中心3大核心问题完整解决方案
  • 有向空间网络模型与兴趣聚类系数研究
  • ksnip终极指南:5分钟掌握这款强大的跨平台截图工具
  • Windows 11优化终极指南:如何用Win11Debloat免费提升系统性能51%
  • 终极Kubernetes证书监控工具:x509-certificate-exporter核心功能解析
  • 如何扩展LIRE:自定义图像特征提取器的开发指南 [特殊字符]

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号