调停者/中介者 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 不断的去队列找最前面的任务处理;相当于是集中管理