【设计模式系列】中介者模式(十八)

一、什么是中介者模式

中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过一个中介者对象来封装一系列对象之间的交互,使这些对象不需要相互显式引用。中介者模式提供了一个中介层,用以协调各个对象之间的通信,从而减少它们之间的耦合度。

二、中介者模式的角色

  1. **抽象中介者(Mediator):**定义了同事对象用来与中介者通信的接口,规定了中介者必须实现的方法。其作用是声明并规范中介者的操作,以便具体中介者能够实现这些操作来协调同事对象之间的交互 。

  2. 具体中介者(ConcreteMediator):实现抽象中介者的接口,管理同事对象的引用,并根据具体的业务逻辑处理同事之间的交互 。

  3. 抽象同事类(Colleague):定义同事类的接口,包含一个保存中介者对象的引用的方法以及同事对象交互的抽象方法 ,也实现所有相互影响的同事类的公共功能 。

  4. **具体同事类(Concrete Colleague):**实现了抽象同事类的接口,是真正参与到交互中的对象。当需要与其他同事对象交互时,会通过中介者对象来进行后续的交互,而不是直接与其他同事对象通信 。

三、中介者模式的典型应用

  • 事件调度和监听器管理:在需要事件调度和监听器管理的系统中,中介者模式可以用来管理事件的注册、触发和分发。

四、中介者模式在**Timer中的应用**

中介者模式在 java.util.Timer 类中的应用是一个典型的实例,其中 Timer 类充当中介者,而 TimerTask 任务则作为同事类。以下是详细的描述和代码示例:

  1. 抽象中介者(Mediator) :在 Timer 的上下文中,这个接口是由 Timer 类实现的,它提供了一个接口,用于调度 TimerTask 对象。

  2. 具体中介者(ConcreteMediator) :这是 Timer 类本身,它维护了一个任务队列(TaskQueue),并使用一个内部的线程(TimerThread)来执行这些任务。

  3. 抽象同事类(Colleague) :在这个场景中,抽象同事类是由 TimerTask 接口实现的,它定义了任务需要执行的操作。

  4. 具体同事类(Concrete Colleague) :这是实现 TimerTask 接口的具体任务类,它们通过 Timer 类来安排自己的执行。

java 复制代码
import java.util.Timer;
import java.util.TimerTask;

// 具体同事类:实现TimerTask接口的具体任务
class MyTask extends TimerTask {
    @Override
    public void run() {
        System.out.println("TimerTask is executed at " + System.currentTimeMillis());
    }
}

public class TimerMediatorPattern {
    public static void main(String[] args) {
        // 具体中介者:创建Timer对象
        Timer timer = new Timer();

        // 创建具体同事对象:创建任务
        MyTask task = new MyTask();

        // 通过中介者安排任务的执行:安排任务在3秒后执行
        timer.schedule(task, 3000);
    }
}
  • Timer 类是中介者,它负责管理 TimerTask 对象的执行。
  • MyTask 类是具体同事类,它实现了 TimerTask 接口,并定义了任务的具体行为。
  • 主函数中创建了 Timer 对象和 MyTask 对象,并通过 Timerschedule 方法安排 MyTask 在3秒后执行。

工作原理:

  1. 注册任务 :通过 Timerschedule 方法,将 TimerTask 对象和执行时间注册到 Timer 中。

  2. 执行任务Timer 内部使用一个线程(TimerThread)来监控任务队列,当任务到达指定时间时,TimerThread 会执行这些任务。

  3. 解耦同事类TimerTask 对象不需要知道其他任务的存在,也不需要直接与它们交互,所有的调度和执行都是通过 Timer 完成的,这样就降低了任务之间的耦合度。

中介者模式在 Timer 类中的应用有效地将任务的调度和执行逻辑与任务的具体逻辑分离,提高了代码的模块化和可维护性 。

相关推荐
思忖小下4 分钟前
梳理你的思路(从OOP到架构设计)_设计模式Template Method模式
设计模式·模板方法模式·eit
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫5 小时前
泛型(2)
java
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石5 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp5 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea