中介者模式

使用中介者模式来集中相关对象之间复杂的沟通和控制方式。

示例—智能家居

智能屋中有闹钟、日历、咖啡壶、喷头。用户设置了以下命令

  1. 如果点击煮咖啡按钮,闹钟就会在5秒后告诉咖啡壶开始煮咖啡。
  2. 周末不要供应咖啡。
  3. 在洗澡前喷头自动开启,开始向澡盆灌水,50秒后自动关闭喷头。
  4. 在丢垃圾的日子,闹钟将提示。

UML图表示

中介者模式-智能家居

代码演示

事件接口(用于使用匿名内部类)

package Mediator;

public interface Event<T> {
    void execute(T component);
}

闹钟类

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();
        }
    }

}

咖啡壶类

package Mediator;

public class CoffeePot {
    void boilCoffee(){
        System.out.println("Boiling Coffee......");
    }
}

日历类

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;
    }
}

喷头类

package Mediator;

public class Sprinkler {
    void open(){
        System.out.println("Opening sprinkler");
    }

    void close(){
        System.out.println("Closing sprinkler");
    }
}

中介者类

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"));
        }
    }
}

测试代码

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();

    }
}

测试结果

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容