Update 设计模式 - 中介者.md

重新绘制类图 dp-mediator.png;对代码实现进行文字校对,补充中介者模式优缺点分析,并调整 JDK 应用小节的内容描述。
This commit is contained in:
CyC2018
2026-10-30 20:19:42 +08:00
parent c7503b49fb
commit 1f93c6bd36
2 changed files with 23 additions and 22 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 227 KiB

+23 -22
View File
@@ -4,8 +4,8 @@
集中相关对象之间复杂的沟通和控制方式。
### 类图
- Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信。
- Colleague:同事,相关对象
- Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信;
- Colleague:同事,需要互相协作的相关对象。
<div align="center"> <img src="pics/dp-mediator.png" width="760px"/> </div><br>
@@ -52,14 +52,14 @@ public class CoffeePot extends Colleague {
```
```java
public class Calender extends Colleague {
public class Calendar extends Colleague {
@Override
public void onEvent(Mediator mediator) {
mediator.doEvent("calender");
mediator.doEvent("calendar");
}
public void doCalender() {
System.out.println("doCalender()");
public void doCalendar() {
System.out.println("doCalendar()");
}
}
```
@@ -87,13 +87,13 @@ public abstract class Mediator {
public class ConcreteMediator extends Mediator {
private Alarm alarm;
private CoffeePot coffeePot;
private Calender calender;
private Calendar calendar;
private Sprinkler sprinkler;
public ConcreteMediator(Alarm alarm, CoffeePot coffeePot, Calender calender, Sprinkler sprinkler) {
public ConcreteMediator(Alarm alarm, CoffeePot coffeePot, Calendar calendar, Sprinkler sprinkler) {
this.alarm = alarm;
this.coffeePot = coffeePot;
this.calender = calender;
this.calendar = calendar;
this.sprinkler = sprinkler;
}
@@ -106,8 +106,8 @@ public class ConcreteMediator extends Mediator {
case "coffeePot":
doCoffeePotEvent();
break;
case "calender":
doCalenderEvent();
case "calendar":
doCalendarEvent();
break;
default:
doSprinklerEvent();
@@ -117,7 +117,7 @@ public class ConcreteMediator extends Mediator {
public void doAlarmEvent() {
alarm.doAlarm();
coffeePot.doCoffeePot();
calender.doCalender();
calendar.doCalendar();
sprinkler.doSprinkler();
}
@@ -125,7 +125,7 @@ public class ConcreteMediator extends Mediator {
// ...
}
public void doCalenderEvent() {
public void doCalendarEvent() {
// ...
}
@@ -140,9 +140,9 @@ public class Client {
public static void main(String[] args) {
Alarm alarm = new Alarm();
CoffeePot coffeePot = new CoffeePot();
Calender calender = new Calender();
Calendar calendar = new Calendar();
Sprinkler sprinkler = new Sprinkler();
Mediator mediator = new ConcreteMediator(alarm, coffeePot, calender, sprinkler);
Mediator mediator = new ConcreteMediator(alarm, coffeePot, calendar, sprinkler);
// 闹钟事件到达,调用中介者就可以操作相关对象
alarm.onEvent(mediator);
}
@@ -152,18 +152,19 @@ public class Client {
```text
doAlarm()
doCoffeePot()
doCalender()
doCalendar()
doSprinkler()
```
闹钟不知道还有咖啡壶和喷头,新增一个设备只需要修改 ConcreteMediator。需要注意的是,对象之间的交互逻辑都集中到了中介者中,设备多了以后中介者本身会变得庞大、难以维护。
### JDK 中的应用
- All scheduleXXX() methods of [java.util.Timer](http://docs.oracle.com/javase/8/docs/api/java/util/Timer.html)
- [java.util.concurrent.Executor#execute()](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html#execute-java.lang.Runnable-)
- submit() and invokeXXX() methods of [java.util.concurrent.ExecutorService](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html)
- scheduleXXX() methods of [java.util.concurrent.ScheduledExecutorService](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html)
- [java.lang.reflect.Method#invoke()](http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html#invoke-java.lang.Object-java.lang.Object...-)
- [java.util.Timer](http://docs.oracle.com/javase/8/docs/api/java/util/Timer.html) 的 scheduleXXX() 方法;
- [java.util.concurrent.Executor#execute()](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html#execute-java.lang.Runnable-);
- [java.util.concurrent.ExecutorService](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html) 的 submit() 和 invokeXXX() 方法;
- [java.util.concurrent.ScheduledExecutorService](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html) 的 scheduleXXX() 方法。
## 参考资料
- 弗里曼. Head First 设计模式 [M]. 中国电力出版社, 2007.
- Gamma E. 设计模式: 可复用面向对象软件的基础 [M]. 机械工业出版社, 2007.
- Gamma E. 设计模式:可复用面向对象软件的基础 [M]. 机械工业出版社, 2007.