• 设计模式之中介者模式(十五)


    目录

    1. 背景

    1.1 智能家庭管理项目

    1.2 中介者模式概述

    2. 中介者模式

    2.1 中介者模式解决上述问题


    1. 背景

    1.1 智能家庭管理项目

    智能家庭项目:
    • 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等。
    • 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放。
    这个可以用之前外观模式来解决,但外观模式有个缺点流程是固定的,一个流程就对应一个类。
    可以用到中介者模式。

    1.2 中介者模式概述

    • 中介者模式(Mediator Pattern,用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
    • 比如MVC模式,CController控制器)是MModel模型)和VView视图)的中 介者,在前后端交互时起到了中间人的作用。
    • 中介者模式核心是避免子系统间互相调用,可以达到解耦

     对原理类图的说明-即(中介者模式的角色及职麦)

    • Mediator就是抽象中介者,定义了同事对象到中介者对象的接口2.Colleague是抽象同事类。
    • ConcreteMediator具体的中介者对象,实现抽象方法,他需要知道所有的具体的同事类即以一个集合来管理HashMap,并接受某个同事对象消息,完成相应的任务。
    • ConcreteColleague具体的同事类,会有很多,每个同事只知道自己的行为,而不了解其他同事类的行为(方法),但是他们都依赖中介者对象。

    2. 中介者模式

    2.1 中介者模式解决上述问题

     中介者

    1. public abstract class Mediator {
    2. //将给中介者对象,加入到集合中
    3. public abstract void Register(String colleagueName, Colleague colleague);
    4. //接收消息, 具体的同事对象发出
    5. public abstract void GetMessage(int stateChange, String colleagueName);
    6. public abstract void SendMessage();
    7. }
    8. //具体的中介者类
    9. public class ConcreteMediator extends Mediator {
    10. //集合,放入所有的同事对象
    11. private HashMap colleagueMap;
    12. private HashMap interMap;
    13. public ConcreteMediator() {
    14. colleagueMap = new HashMap();
    15. interMap = new HashMap();
    16. }
    17. @Override
    18. public void Register(String colleagueName, Colleague colleague) {
    19. colleagueMap.put(colleagueName, colleague);
    20. if (colleague instanceof Alarm) {
    21. interMap.put("Alarm", colleagueName);
    22. } else if (colleague instanceof CoffeeMachine) {
    23. interMap.put("CoffeeMachine", colleagueName);
    24. } else if (colleague instanceof TV) {
    25. interMap.put("TV", colleagueName);
    26. } else if (colleague instanceof Curtains) {
    27. interMap.put("Curtains", colleagueName);
    28. }
    29. }
    30. //具体中介者的核心方法
    31. //1. 根据得到消息,完成对应任务
    32. //2. 中介者在这个方法,协调各个具体的同事对象,完成任务
    33. @Override
    34. public void GetMessage(int stateChange, String colleagueName) {
    35. //处理闹钟发出的消息
    36. if (colleagueMap.get(colleagueName) instanceof Alarm) {
    37. if (stateChange == 0) {
    38. ((CoffeeMachine) (colleagueMap.get(interMap
    39. .get("CoffeeMachine")))).StartCoffee();
    40. ((TV) (colleagueMap.get(interMap.get("TV")))).StartTv();
    41. } else if (stateChange == 1) {
    42. ((TV) (colleagueMap.get(interMap.get("TV")))).StopTv();
    43. }
    44. } else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {
    45. ((Curtains) (colleagueMap.get(interMap.get("Curtains"))))
    46. .UpCurtains();
    47. } else if (colleagueMap.get(colleagueName) instanceof TV) {//如果TV发现消息
    48. } else if (colleagueMap.get(colleagueName) instanceof Curtains) {
    49. //如果是以窗帘发出的消息,这里处理...
    50. }
    51. }
    52. @Override
    53. public void SendMessage() {
    54. }
    55. }

    同事类

    1. //同事抽象类
    2. public abstract class Colleague {
    3. private Mediator mediator;
    4. public String name;
    5. public Colleague(Mediator mediator, String name) {
    6. this.mediator = mediator;
    7. this.name = name;
    8. }
    9. public Mediator GetMediator() {
    10. return this.mediator;
    11. }
    12. public abstract void SendMessage(int stateChange);
    13. }
    1. //具体的同事类
    2. public class Alarm extends Colleague {
    3. //构造器
    4. public Alarm(Mediator mediator, String name) {
    5. super(mediator, name);
    6. //在创建Alarm 同事对象时,将自己放入到ConcreteMediator 对象中[集合]
    7. mediator.Register(name, this);
    8. }
    9. public void SendAlarm(int stateChange) {
    10. SendMessage(stateChange);
    11. }
    12. @Override
    13. public void SendMessage(int stateChange) {
    14. //调用的中介者对象的getMessage
    15. this.GetMediator().GetMessage(stateChange, this.name);
    16. }
    17. }
    18. public class CoffeeMachine extends Colleague {
    19. public CoffeeMachine(Mediator mediator, String name) {
    20. super(mediator, name);
    21. mediator.Register(name, this);
    22. }
    23. @Override
    24. public void SendMessage(int stateChange) {
    25. this.GetMediator().GetMessage(stateChange, this.name);
    26. }
    27. public void StartCoffee() {
    28. System.out.println("It's time to startcoffee!");
    29. }
    30. public void FinishCoffee() {
    31. System.out.println("After 5 minutes!");
    32. System.out.println("Coffee is ok!");
    33. SendMessage(0);
    34. }
    35. }
    36. ......其他类似
  • 相关阅读:
    抖音热搜榜上榜操作策略
    2022年武汉名品认定条件以及申报奖励补贴标准汇总
    【OpenCV小练手】-仿造验证码去除干扰因子
    Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上
    matlab自动生成FPGA rom源码
    [字符串和内存函数]strcmp和strncmp以及memcmp的区别
    Redis IO 多路复用机制
    python最常用的三种输出格式
    tiktok小店无货源店群管理系统分析
    Web入门
  • 原文地址:https://blog.csdn.net/weixin_45734473/article/details/128181025