使用中介者模式來(lái)集中相關(guān)對(duì)象之間復(fù)雜的溝通和控制方式。
示例—智能家居
智能屋中有鬧鐘、日歷、咖啡壺、噴頭。用戶設(shè)置了以下命令
- 如果點(diǎn)擊煮咖啡按鈕,鬧鐘就會(huì)在5秒后告訴咖啡壺開(kāi)始煮咖啡。
- 周末不要供應(yīng)咖啡。
- 在洗澡前噴頭自動(dòng)開(kāi)啟,開(kāi)始向澡盆灌水,50秒后自動(dòng)關(guān)閉噴頭。
- 在丟垃圾的日子,鬧鐘將提示。
UML圖表示

中介者模式-智能家居
代碼演示
事件接口(用于使用匿名內(nèi)部類(lèi))
package Mediator;
public interface Event<T> {
void execute(T component);
}
鬧鐘類(lèi)
package Mediator;
public class Alarm {
void alert(int delay, Event<Alarm> event){
try {
Thread.sleep(500);
System.out.println("Ringing.......");
if (delay > 0) System.out.print("It has passed " + delay + " seconds. ");
event.execute(this);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
咖啡壺類(lèi)
package Mediator;
public class CoffeePot {
void boilCoffee(){
System.out.println("Boiling Coffee......");
}
}
日歷類(lèi)
package Mediator;
import java.util.Random;
public class Calendar {
Random random;
Calendar(){
random = new Random(47);
}
boolean isWeekend(){
int resultRandom = random.nextInt(10);
return resultRandom % 2 == 1;
}
boolean isTrashDay(){
int resultRandom = random.nextInt(10);
return resultRandom % 2 == 1;
}
}
噴頭類(lèi)
package Mediator;
public class Sprinkler {
void open(){
System.out.println("Opening sprinkler");
}
void close(){
System.out.println("Closing sprinkler");
}
}
中介者類(lèi)
package Mediator;
public class Mediator {
private Alarm alarm;
private CoffeePot coffeePot;
private Sprinkler sprinkler;
private Calendar calendar;
Mediator(Alarm alarm,CoffeePot coffeePot,Sprinkler sprinkler, Calendar calendar){
this.alarm = alarm;
this.coffeePot = coffeePot;
this.sprinkler = sprinkler;
this.calendar = calendar;
}
void wannaCoffee(){
if (calendar.isWeekend()) {
System.out.println("It isn't supplied coffee on weekend.");
return;
}
alarm.alert(5, component -> coffeePot.boilCoffee());
}
void takeBath(){
sprinkler.open();
alarm.alert(50, component -> sprinkler.close());
}
void alertTrashDay(){
if (calendar.isTrashDay()) {
alarm.alert(0, component -> System.out.println("It's time to take out the trash"));
}
}
}
測(cè)試代碼
package Mediator;
public class MediatorDriver {
public static void main(String[] args) {
Alarm alarm = new Alarm();
Calendar calendar = new Calendar();
CoffeePot coffeePot = new CoffeePot();
Sprinkler sprinkler = new Sprinkler();
Mediator mediator = new Mediator(alarm,coffeePot,sprinkler,calendar);
mediator.wannaCoffee();
mediator.takeBath();
mediator.alertTrashDay();
}
}
測(cè)試結(jié)果
Ringing.......
It has passed 5 seconds. Boiling Coffee......
Opening sprinkler
Ringing.......
It has passed 50 seconds. Closing sprinkler
Ringing.......
It's time to take out the trash