【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("您的茶来了,我刚倒的茶有点热您注意别烫着啊!");
    }
}

总结:

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

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

相关推荐
七七powerful3 分钟前
docker28.1.1和docker-compose v.2.35.1安装
java·docker·eureka
enjoy编程7 分钟前
Spring boot 4 探究netty的关键知识点
spring boot·设计模式·reactor·netty·多线程
小白学大数据12 分钟前
百科词条结构化抓取:Java 正则表达式与 XPath 解析对比
java·开发语言·爬虫·正则表达式
2501_9418072618 分钟前
在迪拜智能机场场景中构建行李实时调度与高并发航班数据分析平台的工程设计实践经验分享
java·前端·数据库
加洛斯19 分钟前
SpringSecurity入门篇(1)
后端·架构
一 乐22 分钟前
餐厅点餐|基于springboot + vue餐厅点餐系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
用户938169125536023 分钟前
Head First 单例模式
后端·设计模式
ss27324 分钟前
volatile的可见性、安全发布的秘密与ThreadLocal原理
java·开发语言
小猪配偶儿_oaken32 分钟前
SpringBoot实现单号生成功能(Java&若依)
java·spring boot·okhttp
宋情写32 分钟前
JavaAI04-RAG
java·人工智能