设计模式-行为型模式-调停者-中介者 Mediator&门面Facade模式

本文介绍了Mediator(调停者)和Facade(门面)设计模式,这两种模式用于降低系统模块间的耦合度。Mediator通过提供一个统一接口来协调各组件间的通信,避免直接相互依赖;而Facade作为子系统对外的统一接口,简化了系统调用。以Java.util.Timer为例,解释了Mediator模式在实际应用中的工作原理,展示了其在任务调度中的集中管理功能。
摘要由CSDN通过智能技术生成

调停者/中介者 Mediator 模式&门面Facade模式

1.简介

1.1 架构演变

一个程序中各个模块之间相互通信的时候,最直接的方式是直接调用或者是发送消息;当数量过多的时候,可能会照成混乱;

在这里插入图片描述

这个时候的问题就是蓝色系统对红色系统的调用需要一个中间者统一管理就好了,不需要一个个去访问在处理

在这里插入图片描述

这个中间者就是门面;

那这个时候红色部分也是如此,如果都是使用门面的方式通信,是不是就是下面的架构

在这里插入图片描述

所有程序模块模块都去和门面里面去处理,门面的作用也相当于是调停了各个程序模块之间的相互调用;

1.2 优点

可以从上图中 直观的看到,原本系统调用,混乱,逻辑难以梳理,系统之间耦合度高;

1.3 缺点

原本是多个对象之间的相互依赖,变成了都依赖与中介者;中介者 的逻辑会相对复杂;

2.角色

  • 抽象中介者(Mediator):它是中介者的接口,定义了参与者的交互方式;
  • 具体中介者(ConcreteMediator):实现中介者接口;
  • 抽象同事类(Colleague):定义需要刁姐的参与者如何交互;
  • 具体同事类(ConcreteColleague):是抽象同事类的实现者;

在这里插入图片描述

3.应用

次模式在JDK 中的应用java.util.Timer;

功能简单的说就是,执行一些定时任务或者是延时任务; 下面就解析一下 是如何使用中介模式

先看看两个对象,一个是

// 任务队列  在对象创建时候就初始化,final  不可修改  一个内部类,里面 主要是实现一个二叉堆,然后添加一些常用add  size  clear getMin
private final TaskQueue queue = new TaskQueue();

// 任务队列  在对象创建时候就初始化,final  不可修改   集成自Thread   该run 方法里面是个循环 ; 持有一个queue
private final TimerThread thread = new TimerThread(queue);

//调度线程 在调度
private void mainLoop() {
		while (true) {
			try {
				TimerTask task;
				boolean taskFired;
				synchronized (queue) {
					// Wait for queue to become non-empty
					while (queue.isEmpty() && newTasksMayBeScheduled)
						queue.wait();
					if (queue.isEmpty())
						break; // Queue is empty and will forever remain; die

					// Queue nonempty; look at first evt and do the right thing
					long currentTime, executionTime;
					task = queue.getMin();
					synchronized (task.lock) {
						if (task.state == TimerTask.CANCELLED) {
							queue.removeMin();
							continue; // No action required, poll queue again
						}
						currentTime = System.currentTimeMillis();
						executionTime = task.nextExecutionTime;
						if (taskFired = (executionTime <= currentTime)) {
							if (task.period == 0) { // Non-repeating, remove
								queue.removeMin();
								task.state = TimerTask.EXECUTED;
							} else { // Repeating task, reschedule
								queue.rescheduleMin(
										task.period < 0 ? currentTime - task.period : executionTime + task.period);
							}
						}
					}
					if (!taskFired) // Task hasn't yet fired; wait
						queue.wait(executionTime - currentTime);
				}
				if (taskFired) // Task fired; run it, holding no locks
					task.run();
			} catch (InterruptedException e) {
			}
		}
	}

内部流程图

在这里插入图片描述

一个Timer 对象内部 有一个队列 ,所有的外部添加任务 都添加到这个队列

一个Timer 对象内部 有执行线程 TimerThread 不断的去队列找最前面的任务处理;相当于是集中管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值