中介者模式

使用中介者模式來(lái)集中相關(guān)對(duì)象之間復(fù)雜的溝通和控制方式。

示例—智能家居

智能屋中有鬧鐘、日歷、咖啡壺、噴頭。用戶設(shè)置了以下命令

  1. 如果點(diǎn)擊煮咖啡按鈕,鬧鐘就會(huì)在5秒后告訴咖啡壺開(kāi)始煮咖啡。
  2. 周末不要供應(yīng)咖啡。
  3. 在洗澡前噴頭自動(dòng)開(kāi)啟,開(kāi)始向澡盆灌水,50秒后自動(dòng)關(guān)閉噴頭。
  4. 在丟垃圾的日子,鬧鐘將提示。

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 意圖 用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改...
    tomas家的小撥浪鼓閱讀 1,216評(píng)論 0 0
  • 1 場(chǎng)景問(wèn)題# 1.1 如果沒(méi)有主板## 大家都知道,電腦里面各個(gè)配件之間的交互,主要是通過(guò)主板來(lái)完成的(事實(shí)上主...
    七寸知架構(gòu)閱讀 2,301評(píng)論 0 56
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是中介者模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 一...
    w1992wishes閱讀 1,279評(píng)論 0 4
  • 前言 Android的設(shè)計(jì)模式系列文章介紹,歡迎關(guān)注,持續(xù)更新中: Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則一...
    四月葡萄閱讀 4,084評(píng)論 0 9
  • 慕娜美還沒(méi)到貨,老師容我任性一次,水彩筆涂太影響效果了,本來(lái)畫(huà)的就不好,呵呵
    anlence閱讀 176評(píng)論 1 0

友情鏈接更多精彩內(nèi)容