然后创建ChatRoom类。
public class ChatRoom {
public void showMsg(User user, String msg) {
System.out.println(“[” + user.getName() + “] :” + msg);
}
}
最后编写客户端测试代码。
public static void main(String[] args) {
ChatRoom room = new ChatRoom();
User tom = new User(“Tom”,room);
User jerry = new User(“Jerry”,room);
tom.sendMessage(“Hi! I am Tom.”);
jerry.sendMessage(“Hello! My name is Jerry.”);
}
运行结果如下图所示。
4 中介者模式在JDK源码中的应用
首先来看JDK中的Timer类。打开Timer的结构,我们发现Timer类中有很多schedule()重载方法,如下图所示。
任意点开其中一个方法,我们发现所有方法最终都调用了私有的schedule()方法,源码如下。
public class Timer {
…
public void schedule(TimerTask task, long delay) {
if (delay < 0)
throw new IllegalArgumentException(“Negative delay.”);
sched(task, System.currentTimeMillis()+delay, 0);
}
…
private void sched(TimerTask task, long time, long period) {
if (time < 0)
throw new IllegalArgumentException(“Illegal execution time.”);
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();
}
}
…
}
而且,不管是什么样的任务都被加入一个队列中按顺序执行。我们把这个队列中的所有对象都称为“同事”。同事之间的通信都是通过Timer来协调完成的,Timer承担了中介者的角色。
设计模式系列文
《设计模式就该这样学》之彻底搞懂Spring状态机原理,实现订单与物流解耦
《设计模式就该这样学》之手写自定义迭代器,秒懂迭代器底层原理
《设计模式就该这样学》之意外发现,原来你不知道自己每天都在用门面模式
面试结束复盘查漏补缺
每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~
重要的事说三遍,关注+关注+关注!
更多笔记分享
Redis、Java并发编程等等面试题和答案,用于参考~
重要的事说三遍,关注+关注+关注!
[外链图片转存中…(img-PRFfXqSK-1714505610236)]
[外链图片转存中…(img-MhPXd33n-1714505610237)]
更多笔记分享
[外链图片转存中…(img-vudkDbwq-1714505610237)]