【Java设计模式】行为型设计模式-委派模式(十七)

委派模式

  • 委派模式是将具体由调用者去实现的功能将其委托交付给一个或多个中间者进行处理,处理完成后又回复给调用者的模式。

进一步阐述:

  • 我们可以理解成上级分配任务到具体的员工,比如说一个大老板手下有上千个员工,平常端茶递水的活肯定不是自己干。一般口渴了就会跟下面经理说:小张啊 我口渴了给我倒杯茶!
  • 然后张经理面带微笑着回答:好的老板,这就给您倒茶。然后张经理跟下面的员工说:小刘啊,去倒杯茶过来快点哟!
  • 一会小刘把茶端过来递给张经理,张经理屁颠屁颠地把茶送到老板面前说:您要的茶来了,有点热您注意别烫着啊。
  • 这整个流程就是委派模式,老板将倒茶任务委派给张经理,张经理再将倒茶任务委派给小刘。

委派模式包含三种角色:

  • AbstractTask (抽象任务角色):是一个抽象类或者接口,含有需要处理的数据逻辑的方法,表示一个需要被执行的任务。
  • Delegater(委派者):实现或者继承了抽象任务角色,持有一个抽象任务角色(即被委派者)的引用并提供一个方法将任务委派给具体任务角色。
  • ConcreteTask(具体任务角色):实现或者继承了抽象任务角色,也是被委派者,负责具体去执行分派的任务的逻辑。

案例:上级分配经理去倒水,经理再委派给普通员工去倒水为例。其中员工Employee接口就是抽象任务角色,经理Manager类就是委派者,普通员工OrdinaryEmployee类就是具体任务角色。

UML类图:

客户端Client类:

java 复制代码
/**
 * 使用委派模式的客户端
 */
public class Client {
​
    public static void main(String[] args) {
        Boss boss = new Boss();
        boss.handOverSomething();
    }
}

老板Boss类:

java 复制代码
/**
 * 老板类
 */
public class Boss {
​
    /**
     * 交代经理去做某事
     */
    public void handOverSomething() {
        Manager mng = new Manager(new OrdinaryEmployee());
        mng.doSomething();
    }
}

员工Employee接口:

java 复制代码
/**
 * 员工接口(抽象任务角色)
 */
public interface Employee {
​
    /**
     * 做某事
     */
    void doSomething();
}

经理Manager类:

java 复制代码
/**
 * 经理类(委派者角色)
 */
public class Manager implements Employee {
​
    private Employee employee;
​
    public Manager(Employee employee) {
        this.employee = employee;
    }
​
    /**
     * 做某事
     */
    @Override
    public void doSomething() {
        employee.doSomething();
    }
}

普通员工OrdinaryEmployee类:

java 复制代码
/**
 * 普通员工类(具体任务角色也是被委派者)
 */
public class OrdinaryEmployee implements Employee {
​
    /**
     * 做倒茶水这件事
     */
    @Override
    public void doSomething() {
        System.out.println("您的茶来了,我刚倒的茶有点热您注意别烫着啊!");
    }
}

总结:

  • 委派的核心:就是对任务进行分发、调度、派遣。
  • 委派模式和代理模式的区别:代理模式注重的是过程,委派模式注重的是结果。
  • 委派模式和策略模式的区别:策略模式注重是可扩展性(外部扩展),委派模式注重内部的灵活和复用。
  • 将具体的任务和发布这个任务的调用者中间加上了一个缓冲的相当于中介者一样,使得逻辑的职能分工更加细化和明确,更好的遵守了单一职能原则。
  • 在中间的委派者角色中关联了具体的任务(即被委派者),这样就遵守合成复用原则。

典型运用场景举例: 电商的库存系统中当卖出一件商品或者是商品的数量经过商品管理服务进行修改后,不是直接去调用库存管理服务执行减库存的逻辑,而是委派给消息中间件去做,然后消息中间件又将减库存的任务委派给相关的库存服务执行。

相关推荐
songgz几秒前
洋葱式双向解析器演示(Ruby)
开发语言·后端·ruby
秋邱4 分钟前
AR 应用流量增长与品牌 IP 打造:从被动接单到主动获客
开发语言·人工智能·后端·python·ar·restful
源代码•宸5 分钟前
GoLang并发示例代码2(关于逻辑处理器运行顺序)
服务器·开发语言·经验分享·后端·golang
廋到被风吹走1 小时前
【Spring】Spring Data JPA Repository 自动实现机制深度解析
java·后端·spring
MX_93591 小时前
Spring中Bean的配置(一)
java·后端·spring
sg_knight5 小时前
Spring 框架中的 SseEmitter 使用详解
java·spring boot·后端·spring·spring cloud·sse·sseemitter
郑州光合科技余经理7 小时前
同城系统海外版:一站式多语种O2O系统源码
java·开发语言·git·mysql·uni-app·go·phpstorm
一只乔哇噻7 小时前
java后端工程师+AI大模型开发进修ing(研一版‖day60)
java·开发语言·人工智能·学习·语言模型
Dolphin_Home7 小时前
笔记:SpringBoot静态类调用Bean的2种方案(小白友好版)
java·spring boot·笔记
喵个咪8 小时前
初学者入门:用 go-kratos-admin + protoc-gen-typescript-http 快速搭建企业级 Admin 系统
后端·typescript·go