本文共 3704 字,大约阅读时间需要 12 分钟。
在智能家居系统中,各个设备(如闹钟、咖啡机、窗帘、电视等)通过通信协调彼此的工作状态。然而,直接的通信方式会导致设备间耦合度高,维护性差,且扩展性不足。这种复杂的耦合关系使得系统难以扩展和维护。我们需要找到一种更高效的方式来处理这些设备间的通信。
在传统的智能家居系统中,各个设备通过直接调用彼此的方法来实现状态变化。这意味着:
然而,这样的设计存在以下问题:
中介者模式通过引入一个中间对象来封装各个对象之间的交互。这样,各对象无需直接引用对方,减少耦合程度,提高系统的维护性和扩展性。
中介者模式是一个行为模式,其核心思想是将对象间的交互封装在一个中介者对象中。具体表现为:
考虑智能家居系统的设备间通信,使用中介者模式可以通过以下方式实现:
package com.atguigu.mediator.smarthouse;public abstract class Colleague {    private Mediator mediator;    public String name;    public Colleague(Mediator mediator, String name) {        this.mediator = mediator;        this.name = name;    }    public Mediator GetMediator() {        return this.mediator;    }    public abstract void SendMessage(int stateChange);}  各设备实现Colleague接口,通过中介者对象进行通信:
public class Alarm extends Colleague {    public Alarm(Mediator mediator, String name) {        super(mediator, name);        mediator.Register(name, this);    }    public void SendAlarm(int stateChange) {        SendMessage(stateChange);    }    public void SendMessage(int stateChange) {        this.GetMediator().GetMessage(stateChange, this.name);    }}  中介者类定义了设备间的关系,并协调消息传递:
public class ConcreteMediator extends Mediator {    private HashMap        colleagueMap;    private HashMap          interMap;    public ConcreteMediator() {        colleagueMap = new HashMap<>();        interMap = new HashMap<>();    }    public void Register(String colleagueName, Colleague colleague) {        colleagueMap.put(colleagueName, colleague);        if (colleague instanceof Alarm) {            interMap.put("Alarm", colleagueName);        } else if (colleague instanceof CoffeeMachine) {            interMap.put("CoffeeMachine", colleagueName);        } else if (colleague instanceof TV) {            interMap.put("TV", colleagueName);        } else if (colleague instanceof Curtains) {            interMap.put("Curtains", colleagueName);        }    }    public void GetMessage(int stateChange, String colleagueName) {        if (colleagueMap.get(colleagueName) instanceof Alarm) {            if (stateChange == 0) {                String coffeeMachineName = interMap.get("CoffeeMachine");                String tvName = interMap.get("TV");                ((CoffeeMachine) colleagueMap.get(coffeeMachineName)).StartCoffee();                ((TV) colleagueMap.get(tvName)).StartTv();            } else if (stateChange == 1) {                String tvName = interMap.get("TV");                ((TV) colleagueMap.get(tvName)).StopTv();            }        } else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {            String curtainsName = interMap.get("Curtains");            ((Curtains) colleagueMap.get(curtainsName)).UpCurtains();        }    }}           客户端测试中介者模式的实现:
public class ClientTest {    public static void main(String[] args) {        Mediator mediator = new ConcreteMediator();        Alarm alarm = new Alarm(mediator, "alarm");        CoffeeMachine coffeeMachine = new CoffeeMachine(mediator, "coffeeMachine");        Curtains curtains = new Curtains(mediator, "curtains");        TV tv = new TV(mediator, "TV");        alarm.SendAlarm(0);        coffeeMachine.FinishCoffee();        alarm.SendAlarm(1);    }}  中介者模式通过引入中介者对象将设备间的耦合度降低,提高了系统的可维护性和扩展性。在智能家居系统中,中介者模式非常适合处理多个设备间的状态协调问题。通过正确设计中介者类和相互关系,可以实现松耦合的高效通信,提升系统整体性能和用户体验。
转载地址:http://fitzk.baihongyu.com/