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

2023-11-04

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112

目录

导航

设计模式之六大设计原则
设计模式(一)单例模式
设计模式(二)工厂模式
设计模式(三)策略模式
设计模式(四)适配器模式
设计模式(五)享元模式
设计模式(六)建造者模式
设计模式(七)原型模式
设计模式(八)桥接模式
设计模式(九)外观模式
设计模式(十)组合模式
设计模式(十一)装饰器模式
设计模式(十二)代理模式
设计模式(十三)迭代器模式
设计模式(十四)观察者模式
设计模式(十五)中介者模式
设计模式(十六)命令模式
设计模式(十七)状态模式
设计模式(十八)访问者模式
设计模式(十九)责任链模式
设计模式(二十)解释器模式
设计模式(二十一)备忘录模式
设计模式(二十二)模板模式
设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

前言

当类与类之间的依赖关系非常复杂,犹如一张错综复杂的网络时,我们可以用中介者模式来解耦其中错综复杂的关系。

例子

UML图
mediator

中介者模式通用代码



/
 *
 *@Author ChenjunWang
 *@Description:中介者抽象类
 *@Date: Created in 10:51 2018/4/12
 *@Modified By:
 *
 */
public abstract class Mediator {

    protected Colleague colleagueA;
    protected Colleague colleagueB;

    public Mediator(Colleague colleagueA, Colleague colleagueB) {
        this.colleagueA = colleagueA;
        this.colleagueB = colleagueB;
    }

    public abstract void notifyColleagueA();
    public abstract void notifyColleagueB();
}

    /***
     *
     *@Author ChenjunWang
     *@Description:同事抽象类
     *@Date: Created in 10:54 2018/4/12
     *@Modified By:
     *
     */
    public abstract  class Colleague {
        protected Mediator mediator;
        public void setMediator(Mediator mediator) {
            this.mediator = mediator;
        }
        public abstract void operation();
    }
    /***
 *
 *@Author ChenjunWang
 *@Description:同事A实现类
 *@Date: Created in 10:56 2018/4/12
 *@Modified By:
 *
 */
public class ConcreteColleagueA extends Colleague {

    public void notifyColleagueB() {
        mediator.notifyColleagueB();
    }

    @Override
    public void operation() {
        System.out.println("同事A的操作");
    }
}

/***
 *
 *@Author ChenjunWang
 *@Description:同事B实现类
 *@Date: Created in 10:56 2018/4/12
 *@Modified By:
 *
 */
public class ConcreteColleagueB extends Colleague {
    public void notifyColleagueA() {
        mediator.notifyColleagueA();
    }

    @Override
    public void operation() {
        System.out.println("同事B的操作");
    }
}


/***
 *
 *@Author ChenjunWang
 *@Description:中介者具体实现类
 *@Date: Created in 10:57 2018/4/12
 *@Modified By:
 *
 */
public class ConcreteMediator extends Mediator {
    public ConcreteMediator(Colleague colleagueA, Colleague colleagueB) {
        super(colleagueA, colleagueB);
    }

    @Override
    public void notifyColleagueA() {
        if (colleagueA != null) {
            colleagueA.operation();
        }

    }

    @Override
    public void notifyColleagueB() {
        if (colleagueB != null) {
            colleagueB.operation();
        }

    }
}

/***
 *
 *@Author ChenjunWang
 *@Description:
 *@Date: Created in 10:59 2018/4/12
 *@Modified By:
 *
 */
public class Test {
    public static void main(String[] args) {
        ConcreteColleagueA concreteColleagueA = new ConcreteColleagueA();
        ConcreteColleagueB concreteColleagueB = new ConcreteColleagueB();
        ConcreteMediator concreteMediator = new ConcreteMediator(concreteColleagueA, concreteColleagueB);
        concreteMediator.notifyColleagueA();
        concreteMediator.notifyColleagueB();
    }
}
运行结果如下
------------------------------------------
同事A的操作
同事B的操作

虽然运行结果非常简单,但是他们在调用的时候,不是直接调用的,而是通过ConcreteMediator来调用了。

其实我觉得通用的这个列子不能很好的表达出我对中介者模式的理解,我觉得还是用类似某企鹅的聊天工具来解释会比较好理解。若没有某企鹅,我们之间的聊天
nothave
每增加一个人,都要加好几条线来确保正常沟通,关系非常复杂。
而当有某企鹅后,我们之间的关系变得简单了,耦合度大大降低了
have

/***
 *
 *@Author ChenjunWang
 *@Description:中介者抽象类
 *@Date: Created in 13:34 2018/4/12
 *@Modified By:
 *
 */
public abstract class Mediator {

    List<User> list = new ArrayList<>();//所有在聊天室里的人存这

    abstract void sendToAll(String msg);//群发

    abstract void senToPerson(String msg, String name);//给某个人发送消息

    abstract void join(User user);//用户加入聊天室

    abstract void leave(User user);//用户离开聊天室
}

/***
 *
 *@Author ChenjunWang
 *@Description:聊天平台
 *@Date: Created in 13:39 2018/4/12
 *@Modified By:
 *
 */
public class ChatPlatform extends Mediator {
    @Override
    void sendToAll(String msg) {

        for (User u : list){
            u.accept(msg);
        }
    }

    @Override
    void senToPerson(String msg, String name) {
        for (User u : list){

            if (u.name.equals(name))
                u.accept(msg);
        }

    }

    @Override
    void join(User user) {
        list.add(user);
    }

    @Override
    void leave(User user) {

        list.remove(user);
    }
}


/***
 *
 *@Author ChenjunWang
 *@Description:用户抽象类
 *@Date: Created in 13:35 2018/4/12
 *@Modified By:
 *
 */
public abstract class User {
    protected Mediator mediator;
    String name;
    //在创建对象的时候就把他的中间者传入,他要发送都是通过这个中介者来做的。
    public User(String name, Mediator mediator){
        this.name = name;
        this.mediator = mediator;
    }
    abstract void sendToAll(String msg);//给所有人发消息

    abstract void senToPerson(String msg, String name);//给某个人发送消息

    abstract void accept(String msg);//接受消息

    abstract void join();//加入聊天室

    abstract void leave();//离开聊天室
}

/***
 *
 *@Author ChenjunWang
 *@Description:普通用户
 *@Date: Created in 13:42 2018/4/12
 *@Modified By:
 *
 */
public class NormalUser extends User {


    public NormalUser(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    void sendToAll(String msg) {
        mediator.sendToAll(msg);

    }

    @Override
    void senToPerson(String msg, String name) {

        mediator.senToPerson(msg, name);
    }

    @Override
    void accept(String msg) {
        System.out.println(this.name + "收到消息:" + msg );
    }

    @Override
    void join() {
        mediator.join(this);
    }

    @Override
    void leave() {

        mediator.leave(this);
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:
 *@Date: Created in 13:42 2018/4/12
 *@Modified By:
 *
 */
public class Test {
    public static void main(String[] args) {

        Mediator chatPlatform = new ChatPlatform();
        NormalUser a = new NormalUser("A", chatPlatform);
        NormalUser b = new NormalUser("B", chatPlatform);
        NormalUser c = new NormalUser("C", chatPlatform);
        a.join();
        b.join();
        c.join();
        System.out.println("-----------------A群发送消息------------------");
        a.sendToAll("A:大家听得到吗?");
        System.out.println("-----------------A给B私发消息------------------");
        a.senToPerson("A:B,我只想和你说", "B");
        System.out.println("-----------------B给A私发消息------------------");
        b.senToPerson("B:可以,请说", "A");
        System.out.println("-----------------A离开聊天室------------------");
        a.leave();


        System.out.println("-----------------B群发送消息------------------");
        b.sendToAll("B:A能听到吗");

    }
}
运行结果如下
-------------------------------------------------------------------------------

-----------------A群发送消息------------------
A收到消息:A:大家听得到吗?
B收到消息:A:大家听得到吗?
C收到消息:A:大家听得到吗?
-----------------A给B私发消息------------------
B收到消息:A:B,我只想和你说
-----------------B给A私发消息------------------
A收到消息:B:可以,请说
-----------------A离开聊天室------------------
-----------------B群发送消息------------------
B收到消息:B:A能听到吗
C收到消息:B:A能听到吗

以上便是LZ使用中介者模式实现了简单的群聊和单聊的模型。相信各位看官能理解中介者模式到底是干嘛的了。所有用户不再私下对话,全部交流都通过中介来完成,各个用户关系解耦,依赖关系从之前的网状变成星型。

像LZ日常用来开发的MVC 框架就是使用了中介者模式,其中Controller就是 Model和 View的中介者。

总结

优点

(1)解耦了类与类之间的关系
(2)将对象间多对多的关联转变为一对多的关联,使对象间的关系易于理解和维护。

缺点

(1)中介者的逻辑会变得很庞大,变得复杂难以维护.
(2)这是一个中心化的模式,若中介者出现了问题,毫无疑问,整个系统将直接崩溃。

Git地址

本篇实例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/mediator

回到最上方


有什么不懂或者不对的地方,欢迎留言。
喜欢LZ文章的小伙伴们,可以关注一波,也可以留言,LZ会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式(十五)中介者模式 的相关文章

  • Eclipse免费下载(附安装教程)

    软件下载 软件名称 Eclipse 软件大小 750MB 安装环境 Windows 下载链接 https pan baidu com s 1OToZBbONikUYnaS1PN1kRg 提 取 码 geek 建议复制粘贴链接与提取码 安装教

随机推荐

  • 晶振的构造及工作原理

    咱搞硬件的 应该都使用过晶振 上次写开关电源环路的零极点的时候 忽然想到晶振是自己起振的 如果从环路的角度看 应该就是利用的环路不稳定的特性 产生自激振荡 除此之外 我又想到下面这些问题 那么我们使用晶体的时候 电路的环路的传递函数是怎么样
  • scp复制本地文件到远程服务器,scp 本地文件到远程服务器

    linux中scp命令的使用 linux远程拷贝文件命令 scp scp secure corp 1 从本地拷贝文件到远程服务器scp opt script test pl root 192 168 3 130 将本地 opt scritp
  • 量化投资学习-4:股票与美女4-美女自身赚钱的能力

    美女分几种 一种是花瓶式的美女 完全靠的是美貌 靠美貌而吸引了众人的注意力 完全把选择权交个了众人 靠众人的喜欢才有价值 当美貌褪去 众人也就跟着退去 另一种集才华与美貌于一身的美女 不光鲜外在的外貌 漂亮的K线图的走势 还有强大的内在才华
  • AES(Advanced Encryption Standard) Intrinsics各函数介绍

    AES为高级加密标准 是较流行的一种密码算法 SIMD相关头文件包括 include
  • 织梦网站调用变量失败_Request var not allow!织梦DedeCMS添加变量报错的解决办法

    这篇文章主要为大家详细介绍了Request var not allow 织梦DedeCMS添加变量报错的解决办法 具有一定的参考价值 感兴趣的小伙伴们可以参考一下 有需要的朋友可以收藏方便以后借鉴 最近两天不少用户在全力反馈说在后台添加新变
  • idea2020使用idea 没有Run Dashboard

    idea2020版本的 Run Dashboard 等同于Services 我这里添加了Spring boot
  • 蓝桥杯模拟赛 排列序列

    标题 排列序数 X星系的某次考古活动发现了史前智能痕迹 这是一些用来计数的符号 经过分析它的计数规律如下 为了表示方便 我们把这些奇怪的符号用a q代替 abcdefghijklmnopq 表示0 abcdefghijklmnoqp 表示1
  • Typecho博客搭建 实现公网访问内网站点

    文章目录 前言 1 环境安装 2 安装Typecho 3 安装cpolar内网穿透 4 固定公网地址 5 配置Typecho 前言 Typecho是一款PHP语言编写的开源博客程序 它是一个轻量级的内容管理系统 专注于博客领域 支持多用户
  • crontab命令详解,慎用crontab -r命令

    crontab命令详解 慎用crontab r命令 常用命令 常用命令 crontab e是编辑 crontab r 是删除 crontab l是查看 crontab r命令万恶 且不可恢复 切记勿用
  • Android 系统开发系列(1):Android 12 源代码下载、编译和刷机

    Android 12 正式版 已经发布 https mp weixin qq com s OiFSWEnc 0N2z7JYWTJluw 本文就带大家下载和编译最新的 Android 12 代码 本地编译的代码有下面几个好处 可以刷真机 方便
  • LeetCode 349. 两个数组的交集

    题目链接 https leetcode cn problems intersection of two arrays 思路如下 由题目可知 nums1 数组和 nums2 数组中的元素的大小都在 0 1000 0 1000
  • 《画解数据结构》(2 - 4)- AVL 树

    画解数据结构 2 4 AVL 树
  • ChatGPT的未来:研究和开发的领域,渴望带来哪些变革?

    ChatGPT作为一种基于自然语言处理 NLP 技术的人工智能机器人 其未来研究和开发的领域包括但不限于以下几个方面 1 对话质量的提高 ChatGPT目前仍然存在一些语义理解和生成上的问题 未来的研究和开发将会着重于解决这些问题 提高Ch
  • 网站信息收集及nmap的下载使用

    本专栏是笔者的网络安全学习笔记 一面分享 同时作为笔记 前文链接 WAMP DVWA sqli labs 搭建 burpsuite工具抓包及Intruder暴力破解的使用 目录扫描 请求重发 漏洞扫描等工具的使用 信息收集 我们在对一个网站
  • Flash Player 8 中的安全性更改

    要求 用户级别 中级 Macromedia 已更改了 Flash Player 8 中应用于本地 Flash 内容的安全模型 默认情况下 从用户本地文件系统而不是通过 HTTP 运行的 Flash 应用程序在 Flash Player 8
  • petalinux添加AD9361驱动

    文章目录 一 准备工具 二 步骤 需要 petalinux2016 2 包含AD9361驱动的Linux内核 xcomm zynq 4 4 一 准备工具 ADI提供的AD9361Linux驱动 https wiki analog com r
  • tomcat高并发下优化详解及连接数和线程池

    高并发环境下 我知道优化配置tomcat 对连接数和线程池作修改 最重要的是connector的协议Http Connector使用NIO 而不是默认的AJP Connector 当时也没有仔细研究其原理 现在来为以上这些设置做一下剖析 要
  • Java private类构造函数笔记

    前言 最近在看Android源码的时候遇到了private类构造函数 于是写了一个测试小程序 帮助理解 代码 class TestPrivate private TestPrivate System out println TestPriv
  • PAT题解——Basic Level——1094 谷歌的招聘

    题目链接 https pintia cn problem sets 994805260223102976 problems 1071785997033074688 题面 本题要求你编程解决一个更通用的问题 从任一给定的长度为 L 的数字中
  • 设计模式(十五)中介者模式

    版权声明 转载必须注明本文转自晓 晨的博客 http blog csdn net niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址 导航 设计模式之六大设计原则 设计模式 一 单例模式 设计模式 二 工厂模式