diff --git a/notes/设计模式.md b/notes/设计模式.md index 43b0d79b..17505b60 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -1033,7 +1033,162 @@ public class Client { ### 意图 -使用中间人对象来封装对象之间的交互。中间人模式可以降低交互对象之间的耦合程度。 +集中相关对象之间复杂的沟通和控制方式。 + +### 类图 + +- Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信。 +- Colleague:同事,相关对象 + +

+ +### 实现 + +Alarm(闹钟)、CoffeePot(咖啡壶)、Calendar(日历)、Sprinkler(喷头)是一组相关的对象,在某个对象的事件产生时需要去操作其它对象,形成了下面这种依赖结构: + +

+ +使用中介者模式可以将复杂的依赖结构变成星形结构: + +

+ +```java +public abstract class Colleague { + public abstract void onEvent(Mediator mediator); +} +``` + +```java +public class Alarm extends Colleague { + + @Override + public void onEvent(Mediator mediator) { + mediator.doEvent("alarm"); + } + + public void doAlarm() { + System.out.println("doAlarm()"); + } +} +``` + +```java +public class CoffeePot extends Colleague { + @Override + public void onEvent(Mediator mediator) { + mediator.doEvent("coffeePot"); + } + + public void doCoffeePot() { + System.out.println("doCoffeePot()"); + } +} +``` + +```java +public class Calender extends Colleague { + @Override + public void onEvent(Mediator mediator) { + mediator.doEvent("calender"); + } + + public void doCalender() { + System.out.println("doCalender()"); + } +} +``` + +```java +public class Sprinkler extends Colleague { + @Override + public void onEvent(Mediator mediator) { + mediator.doEvent("sprinkler"); + } + + public void doSprinkler() { + System.out.println("doSprinkler()"); + } +} +``` + +```java +public abstract class Mediator { + public abstract void doEvent(String eventType); +} +``` + +```java +public class ConcreteMediator extends Mediator { + private Alarm alarm; + private CoffeePot coffeePot; + private Calender calender; + private Sprinkler sprinkler; + + public ConcreteMediator(Alarm alarm, CoffeePot coffeePot, Calender calender, Sprinkler sprinkler) { + this.alarm = alarm; + this.coffeePot = coffeePot; + this.calender = calender; + this.sprinkler = sprinkler; + } + + @Override + public void doEvent(String eventType) { + switch (eventType) { + case "alarm": + doAlarmEvent(); + break; + case "coffeePot": + doCoffeePotEvent(); + break; + case "calender": + doCalenderEvent(); + break; + default: + doSprinklerEvent(); + } + } + + public void doAlarmEvent() { + alarm.doAlarm(); + coffeePot.doCoffeePot(); + calender.doCalender(); + sprinkler.doSprinkler(); + } + + public void doCoffeePotEvent() { + // ... + } + + public void doCalenderEvent() { + // ... + } + + public void doSprinklerEvent() { + // ... + } +} +``` + +```java +public class Client { + public static void main(String[] args) { + Alarm alarm = new Alarm(); + CoffeePot coffeePot = new CoffeePot(); + Calender calender = new Calender(); + Sprinkler sprinkler = new Sprinkler(); + Mediator mediator = new ConcreteMediator(alarm, coffeePot, calender, sprinkler); + // 闹钟事件到达,调用中介者就可以操作相关对象 + alarm.onEvent(mediator); + } +} +``` + +```java +doAlarm() +doCoffeePot() +doCalender() +doSprinkler() +``` ### JDK diff --git a/pics/5359cbf5-5a79-4874-9b17-f23c53c2cb80.jpg b/pics/5359cbf5-5a79-4874-9b17-f23c53c2cb80.jpg new file mode 100644 index 00000000..a449f38c Binary files /dev/null and b/pics/5359cbf5-5a79-4874-9b17-f23c53c2cb80.jpg differ diff --git a/pics/82cfda3b-b53b-4c89-9fdb-26dd2db0cd02.jpg b/pics/82cfda3b-b53b-4c89-9fdb-26dd2db0cd02.jpg new file mode 100644 index 00000000..2b510c43 Binary files /dev/null and b/pics/82cfda3b-b53b-4c89-9fdb-26dd2db0cd02.jpg differ diff --git a/pics/d0afdd23-c9a5-4d1c-9b3d-404bff3bd0d1.png b/pics/d0afdd23-c9a5-4d1c-9b3d-404bff3bd0d1.png new file mode 100644 index 00000000..58ff84fe Binary files /dev/null and b/pics/d0afdd23-c9a5-4d1c-9b3d-404bff3bd0d1.png differ