提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。
从而降低多个对象和类之间的通信复杂性。
菜鸟教程是举了一个聊天室的例子。
菜鸟教程——中介者模式
我做了点小改动,但意思是一样。
这个ChatRoom 就是中介者,专门去处理User的通讯。
import java.util.Date;
public class ChatRoom {
public static void showMessage(User user, String message){
System.out.println(String.format("%s [%s] : %s"), new Data(), user.getName(), message);
}
}
public class User {
private String name;
public User(String name){
this.name = name;
}
public void sendMessage(String message){
ChatRoom.showMessage(this, message);
}
}
public class MediatorPatternDemo {
public static void main(String[] args) {
User 张三 = new User("张三");
User 李四 = new User("李四");
张三.sendMessage("Hi! 李四!");
李四.sendMessage("Hi! 张三!");
}
}
中介者:Timer
Timer 会维护一个TaskQueue 。
添加TimerTask时会调用sched方法,该方法notify通知唤醒队列里的任务。
public class Timer {
private final TaskQueue queue = new TaskQueue();
private void sched(TimerTask task, long time, long period) {
if (time < 0)
throw new IllegalArgumentException("Illegal execution time.");
// Constrain value of period sufficiently to prevent numeric
// overflow while still being effectively infinitely large.
if (Math.abs(period) > (Long.MAX_VALUE >> 1))
period >>= 1;
synchronized(queue) {
if (!thread.newTasksMayBeScheduled)
throw new IllegalStateException("Timer already cancelled.");
synchronized(task.lock) {
if (task.state != TimerTask.VIRGIN)
throw new IllegalStateException(
"Task already scheduled or cancelled");
task.nextExecutionTime = time;
task.period = period;
task.state = TimerTask.SCHEDULED;
}
queue.add(task);
if (queue.getMin() == task)
queue.notify();
}
}
}
创建型模式
结构型模式
行为型模式