博客
关于我
设计模式-中介者模式
阅读量:771 次
发布时间:2019-03-23

本文共 3704 字,大约阅读时间需要 12 分钟。

设计模式-中介者模式(Mediator Pattern)

问题引出

在智能家居系统中,各个设备(如闹钟、咖啡机、窗帘、电视等)通过通信协调彼此的工作状态。然而,直接的通信方式会导致设备间耦合度高,维护性差,且扩展性不足。这种复杂的耦合关系使得系统难以扩展和维护。我们需要找到一种更高效的方式来处理这些设备间的通信。

传统解决方法

在传统的智能家居系统中,各个设备通过直接调用彼此的方法来实现状态变化。这意味着:

  • 每个设备都需要明确知道其他设备的接口
  • 状态传递可能变得混乱
  • 增加新设备或改变流程会导致大量的重写工作

然而,这样的设计存在以下问题:

  • 当各设备状态多变时,相互调用会过于复杂
  • 设备间高度耦合,难以松解耦合
  • 消息传递容易混乱
  • 增加新设备或改变流程会降低系统的可维护性和扩展性

中介者模式

中介者模式通过引入一个中间对象来封装各个对象之间的交互。这样,各对象无需直接引用对方,减少耦合程度,提高系统的维护性和扩展性。

中介者模式的原理

中介者模式是一个行为模式,其核心思想是将对象间的交互封装在一个中介者对象中。具体表现为:

  • 各对象通过中介者对象进行通信
  • 中介者对象管理各对象之间的关系
  • 中介者模式降低了对象间的耦合度,提高了系统的可维护性和扩展性

中介者模式的实现示例

考虑智能家居系统的设备间通信,使用中介者模式可以通过以下方式实现:

同事接口

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/

你可能感兴趣的文章
Linux下的系统监控与性能调优:从入门到精通
查看>>
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
查看>>
localhost:5000在MacOS V12(蒙特利)中不可用
查看>>
logstash mysql 准实时同步到 elasticsearch
查看>>
Luogu2973:[USACO10HOL]赶小猪
查看>>
mabatis 中出现&lt; 以及&gt; 代表什么意思?
查看>>
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>