1.场景问题解决

1.1 场景描述

智慧房屋公司的产品:
闹钟、咖啡机、电视机、窗帘等

思考如何设计:
各对象有几种状态改变
相互作用如何

1.2 OO设计

1.3 需求变动

1.4 带来问题

2.用设计模式改进

2.1 分析

2.2 重新设计

[外链图片转存失败(img-ik9VrvMn-1568733708520)(https://raw.githubusercontent.com/bobshute/public/master/imgs/csdn/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/20%E4%B8%AD%E4%BB%8B%E8%80%85%E6%A8%A1%E5%BC%8F-2.png)]

2.3 源码

  • vo 该package为同僚相关对象
    • Colleague 同僚,抽象父类
    • Alarm 闹钟 继承Colleague
    • CoffeeMachine 咖啡机 继承Colleague
    • Curtains 窗帘 继承Colleague
    • TV 电视 继承Colleague
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);
}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);}@Overridepublic void SendMessage(int stateChange) {this.GetMediator().GetMessage(stateChange, this.name);}
}public class CoffeeMachine extends Colleague {public CoffeeMachine(Mediator mediator, String name) {super(mediator, name);mediator.Register(name, this);}@Overridepublic void SendMessage(int stateChange) {this.GetMediator().GetMessage(stateChange, this.name);}public void StartCoffee() {System.out.println("It's time to startcoffee!");}public void FinishCoffee() {System.out.println("After 5 minutes!");System.out.println("Coffee is ok!");SendMessage(0);}
}public class Curtains extends Colleague {public Curtains(Mediator mediator, String name) {super(mediator, name);mediator.Register(name, this);}@Overridepublic void SendMessage(int stateChange) {this.GetMediator().GetMessage(stateChange, this.name);}public void UpCurtains() {System.out.println("I am holding Up Curtains!");}
}public class TV extends Colleague {public TV(Mediator mediator, String name) {super(mediator, name);mediator.Register(name, this);}@Overridepublic void SendMessage(int stateChange) {this.GetMediator().GetMessage(stateChange, this.name);}public void StartTv() {System.out.println("It's time to StartTv!");}public void StopTv() {System.out.println("StopTv!");}
}
  • Mediator 中介者接口
    • ConcreteMediator 中介者实现类
public interface Mediator {//注册同僚public abstract void Register(String colleagueName, Colleague colleague);//得到消息后的中介者需要做的操作public abstract void GetMessage(int stateChange, String colleagueName);public abstract void SendMessage();
}public class ConcreteMediator implements Mediator {//注册超类同僚private HashMap<String, Colleague> colleagueMap;//注册子类同僚private HashMap<String, String> interMap;public ConcreteMediator() {colleagueMap = new HashMap<String, Colleague>();interMap = new HashMap<String, String>();}@Overridepublic 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);}}//得到消息后的中介者需要做的操作@Overridepublic void GetMessage(int stateChange, String colleagueName) {if (colleagueMap.get(colleagueName) instanceof Alarm) {if (stateChange == 0) {((CoffeeMachine) (colleagueMap.get(interMap.get("CoffeeMachine")))).StartCoffee();((TV) (colleagueMap.get(interMap.get("TV")))).StartTv();} else if (stateChange == 1) {((TV) (colleagueMap.get(interMap.get("TV")))).StopTv();}} else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {((Curtains) (colleagueMap.get(interMap.get("Curtains")))).UpCurtains();} else if (colleagueMap.get(colleagueName) instanceof TV) {} else if (colleagueMap.get(colleagueName) instanceof Curtains) {}}@Overridepublic void SendMessage() {}
}
  • MediatorTest 测试类
public class MediatorTest {public static void main(String[] args) {Mediator mediator = new ConcreteMediator();Alarm mAlarm = new Alarm(mediator, "mAlarm");CoffeeMachine mCoffeeMachine = new CoffeeMachine(mediator,"mCoffeeMachine");Curtains mCurtains = new Curtains(mediator, "mCurtains");TV mTV = new TV(mediator, "mTV");mAlarm.SendAlarm(0);mCoffeeMachine.FinishCoffee();mAlarm.SendAlarm(1);}
}

3.设计模式总结

3.1 定义

中介者模式:用一个中介对象来封装一系列的对象交互。
中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

3.2 分析思路

[外链图片转存失败(img-rUB9oc6p-1568733708521)(https://raw.githubusercontent.com/bobshute/public/master/imgs/csdn/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/20%E4%B8%AD%E4%BB%8B%E8%80%85%E6%A8%A1%E5%BC%8F-1.png)]

3.3 优缺点

  • 优点:
    通过将对象彼此解耦,可以增加对象的复用性
    通过将控制逻辑集中,可以简化系统维护
    可以让对象之间所传递的消息变得简单而且大幅减少
    提高系统的灵活性,使得系统易于扩展和维护
  • 缺点:
    中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
    如果设计不当,中介者对象本身变得过于复杂

4. 设计模式使用场景及注意

4.1 适用场合:

一组对象之间的通信方式比较复杂,导致相互依赖,结构混乱
一个对象引用很多其他对象并直接与这些对象通信,导致难以复用该对象

5.参考文章

内容总计于HeadFirst设计模式及相关视频

设计模式20-中介者模式相关推荐

  1. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

  2. 设计模式(中介者模式-对象去耦)

    声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时 ...

  3. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  4. 软件设计模式之中介者模式实验

    软件设计模式之中介者模式实验 一.实验目的 掌握软件设计模式中的中介者模式,能够用中介者模式编写程序,解决实际问题. 二.实验内容与要求 内容:有个租房中介为房主和租赁人提供租房服务,请用中介者模式对 ...

  5. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  6. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 设计模式复习-中介者模式

    #pragma once #include "stdafx.h" #include<map> #include<set> #include<strin ...

  8. 【设计模式】中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.中介者模式简介 二.中介者模式适用场景 三.中介者模式优缺点 四.中介者模式 与 观察者模式 五.中介者模式 代码示例 1.聊天室 2.用户 3.运行实例 一.中介者模式简介 中介者模式 ...

  9. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  10. Javascript设计模式之中介者模式

    前言:菜鸡也有梦想,而我的梦想就是进一个真正的互联网大厂.以前学习的时候没有系统的整理,从今天开始要保持每周写博客的习惯,希望自己可以有所成长.为了培养编程思维,决定从设计模式开始写起.我是通过读&l ...

最新文章

  1. Field Service Center Customization
  2. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  3. objc_msgSend() 使用报错解决方案
  4. linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...
  5. 在HermesJMS中创建ActiveMQ Session
  6. php 数字加逗号,PHP数字格式化,数字每三位加逗号
  7. Andriod Studio 使用心得,持续更新中
  8. iOS 解决导航栏左右 BarButtonItem偏移位置的问题
  9. ecshop /goods.php SQL Injection Vul
  10. linux快速查看连接到服务器的ip
  11. anime.js的学习小结
  12. 智能客服搭建(2) - MRCP Server ASR插件开发
  13. 面临裁员潮,更快找到新工作的秘诀
  14. one 主格 复数 宾格_主格、宾格、名词所有格.
  15. chrome谷歌浏览器扩展程序推荐: 一键读图OCR
  16. 打开新世界?从产品经理角度聊聊“高智商”这件事儿
  17. 网络地址转换--静态NAT
  18. P1365 WJMZBMR打osu / Easy(期望)
  19. 2022年全球与中国室温硫化硅橡胶市场现状
  20. 十大排序算法思想和代码总结(Python版)

热门文章

  1. CSU 1976: 搬运工小明(二分)
  2. 格式塔在页面设计中的应用
  3. 新款小程序之趣测小程序介绍及项目发展可行性
  4. 仿凤凰FM图文滑动特效
  5. 运动检测-基于帧间比较减少灯光影响-opencv-python
  6. thymeleaf 基本常识
  7. 厉害了!纯国产飞机GA20首次公开试飞具体是什么情况?还原事发经过详情始末
  8. 如何成为一个优秀SEO内容原创作者
  9. 亚马逊echo中国使用_如何使用Amazon Echo跟踪航班并查找酒店
  10. 上班时能不能戴耳机?V