diff --git a/notes/pics/dp-mediator.png b/notes/pics/dp-mediator.png index f203f62f..25d5b348 100644 Binary files a/notes/pics/dp-mediator.png and b/notes/pics/dp-mediator.png differ diff --git a/notes/设计模式 - 中介者.md b/notes/设计模式 - 中介者.md index d92fb95e..62d7a002 100644 --- a/notes/设计模式 - 中介者.md +++ b/notes/设计模式 - 中介者.md @@ -4,8 +4,8 @@ 集中相关对象之间复杂的沟通和控制方式。 ### 类图 -- Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信。 -- Colleague:同事,相关对象 +- Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信; +- Colleague:同事,需要互相协作的相关对象。

@@ -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.