笨蛋学设计模式行为型模式-中介者模式【24】

行为型模式-中介者模式

    • 8.11中介者模式
      • 8.11.1概念
      • 8.11.2场景
      • 8.11.3优势 / 劣势
      • 8.11.4模式可分为
      • 8.11.5模式
      • 8.11.6实战
        • 8.11.6.1题目描述
        • 8.11.6.2输入描述
        • 8.11.6.3输出描述
        • 8.11.6.4代码
      • 8.11.7总结

8.11中介者模式

8.11.1概念

​ 中介者模式通过引入一个中介者对象来封装一组对象之间的交互,从而可以使这些对象不需要直接相互引用,也就是将系统内多个对象之间的复杂关系转化为多个对象与中介者之间的简单关系。

8.11.2场景

​ 在生活中,可以看到不少网红在直播卖货,也可以看出中介者模式。在主播卖货的过程中,由于设计到多个对象,比如商品、观众、平台等,每个对象都有自己的任务和职责,但是它们之间需要相互协调和交互才能顺利完成卖货的过程。其中主播可以充当中介者的角色,负责协调和调度各个对象的交互。

8.11.3优势 / 劣势

  • 增加可扩展性:当需要增加新的交互时,只需添加新的中介类,而不需要修改已有的类
  • 提高可维护性:可以将多个对象之间的交互逻辑集中在一个对象中

  • 额外的复杂性:引入中介者模式会增加系统的复杂性,因为需要定义中介者接口和实现类,以及将原有对象与中介者对象进行交互
  • 中介者对象职责过重:中介者对象需要处理所有对象之间的交互,与整个系统进行挂钩,一旦出现问题,整个系统也会出现问题

8.11.4模式可分为

  • 抽象中介者Mediator:定义中介者的接口,用于各个具体同事对象之间的通信
  • 具体中介者ConcreteMediator:实现抽象中介者接口,负责协调各个具体同事对象的交互关系,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令
  • 抽象同事类Colleague:定义同事类的接口,维护一个对中介者对象的引用,用于通信
  • 具体同事类ConcreteColleague:实现抽象同事类接口,每个具体同事类只知道自己的行为,而不了解其他同事类的情况,因为它们都需要与中介者通信,通过中介者协调与其他同事对象的交互

8.11.5模式

package com.technologystatck.designpattern.mode.tertiumquid;import java.util.ArrayList;
import java.util.List;public class TertiumQuid {public static void main(String[] args) {//创建中介者ConcreteMediator mediator = new ConcreteMediator();//创建同事对象Colleague colleague1 = new ConcreteColleague1(mediator);Colleague colleague2 = new ConcreteColleague2(mediator);//注册同事对象到中介者mediator.register(colleague1);mediator.register(colleague2);//同事对象发送消息colleague1.send("Hello, colleague2!");colleague2.send("Hello, colleague1!");}
}//抽象中介者
abstract class Mediator {void register(Colleague colleague){};//定义一个抽象的发送消息方法public abstract void send(String message, Colleague colleague);}//具体中介者
class ConcreteMediator extends Mediator{private List<Colleague> colleagues = new ArrayList<>();@Overridepublic void register(Colleague colleague) {colleagues.add(colleague);}@Overridepublic void send(String message,Colleague colleague) {for (Colleague c : colleagues) {//排除发送消息的同事对象if(c!=colleague){c.receive(message);}}}
}//抽象同事对象
abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator=mediator;}//发送消息public abstract void send(String message);//接收消息public abstract void receive(String message);
}//具体同事对象1
class ConcreteColleague1 extends Colleague{public ConcreteColleague1(Mediator mediator) {super(mediator);}@Overridepublic void send(String message) {mediator.send(message,this);}@Overridepublic void receive(String message) {System.out.println("ConcreteColleague1 received: "+message);}
}//具体同事对象2
class ConcreteColleague2 extends Colleague{public ConcreteColleague2(Mediator mediator) {super(mediator);}@Overridepublic void send(String message) {mediator.send(message,this);}@Overridepublic void receive(String message) {System.out.println("ConcreteColleague1 received: "+message);}
}

8.11.6实战

8.11.6.1题目描述

小明正在设计一个简单的多人聊天室系统,有多个用户和一个聊天室中介者,用户通过中介者进行聊天,请你帮他完成这个系统的设计。

8.11.6.2输入描述

第一行包括一个整数N,表示用户的数量(1 <= N <= 100) 第二行是N个用户,比如User1 User2 User3,用空格分隔 第三行开始,每行包含两个字符串,表示消息的发出者和消息内容,用空格分隔

8.11.6.3输出描述

对于每个用户,输出一行,包含该用户收到的所有消息内容。

8.11.6.4代码
package com.technologystatck.designpattern.mode.tertiumquid;import java.util.*;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int nums=scanner.nextInt();//获取用户名列表,用于创建用户对象。ArrayList<String> userNames = new ArrayList<>();for(int i=0;i<nums;i++){userNames.add(scanner.next());}ChatRoomMediator mediator = new ChatRoomMediatorImpl();//批量创建用户for (String userName : userNames) {new ConcreteChatUser(userName,mediator);}//发送消息并输出while(scanner.hasNext()){String sender = scanner.next();String message = scanner.next();//获取发送者信息//获取信息具体内容ChatUser user = mediator.getUsers().get(sender);//若用户不为空,则输出信息,否则输出用户不存在。if(user!=null){user.sendMessage(message);}}}
}//抽象中介者
interface ChatRoomMediator {//发送消息方法void sendMessage(String sender,String message);//添加用户方法void addUser(ChatUser user);//获取用户列表方法,用于输出消息时输出用户列表信息Map<String,ChatUser> getUsers();
}//具体中介者
class ChatRoomMediatorImpl implements ChatRoomMediator{//用户列表,用于存储所有用户对象,以便后续发送消息时,//遍历所有用户对象,并发送消息给所有用户对象。private Map<String,ChatUser> users=new LinkedHashMap<>();@Overridepublic void sendMessage(String sender, String message) {//遍历所有用户对象,并发送消息给所有用户对象。for(ChatUser user:users.values()){if(!user.getName().equals(sender)){user.receiveMessage(sender,message);}}}@Overridepublic void addUser(ChatUser user) {users.put(user.getName(),user);}@Overridepublic Map<String, ChatUser> getUsers() {return users;}
}//抽象同事类
abstract class ChatUser{private String name;private ChatRoomMediator mediator;private List<String> receivedMessages=new ArrayList<>();public ChatUser(String name, ChatRoomMediator mediator) {this.name = name;this.mediator = mediator;mediator.addUser(this);}public String getName() {return name;}//发送消息的方法,由子类实现,实现不同的发送方式public void sendMessage(String message){mediator.sendMessage(name,message);}//接受到消息的方法,由子类实现,实现不同的接受方式public abstract void receiveMessage(String sender,String message);//获取接受者的消息public List<String> getReceivedMessages() {return receivedMessages;}//添加接受者的消息protected void addReceivedMessage(String message){receivedMessages.add(message);}
}//具体同事类
class ConcreteChatUser extends ChatUser{public ConcreteChatUser(String name, ChatRoomMediator mediator) {super(name, mediator);}//接受到消息的方法,实现不同的接受方式@Overridepublic void receiveMessage(String sender, String message) {String receivedMessage=getName()+" received: "+message;addReceivedMessage(receivedMessage);System.out.println(receivedMessage);}
}

8.11.7总结

  • 优点:将多个对象的复杂关系转化为多个对象与中介者的简单关系
  • 总结:通过引入抽象中介者用于定义中介者的接口完成各个同事对象之间的通信,具体中介者用于实现抽象中介者以及协调具体同事类之间的关系,抽象同事类用于维护一个对中介者对象的引用,具体同事类用于与中介者与其他同事对象通信,可以不用知道其他同事类,来完成多个对象与中介者对象的关系之间的交互
  • 场景:适用于当系统对象之间存在复杂的交互关系或系统需要在不同的对象之间进行灵活的通信时使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P9232 [蓝桥杯 2023 省 A] 更小的数

[蓝桥杯 2023 省 A] 更小的数 终于本弱一次通关了一道研究生组别的题了[普及/提高−] 一道较为简单的双指针题,但一定有更好的解法. 题目描述 小蓝有一个长度均为 n n n 且仅由数字字符 0 ∼ 9 0 \sim 9 0∼9 组成的字符串&#xff0c;下标从 0 0 0 到 n − 1 n-1 n−1&a…

C++ //练习 2.35 判断下列定义推断出的类型是什么,然后编写程序进行验证。

C Primer&#xff08;第5版&#xff09; 练习 2.35 练习 2.35 判断下列定义推断出的类型是什么&#xff0c;然后编写程序进行验证。 const int i 42; auto j i; const auto &k i; auto *p &i; const auto j2 i, &k2 i;环境&#xff1a;Linux Ubuntu&#x…

HarmonyOS鸿蒙学习基础篇 - 运行第一个程序 Hello World

下载与安装DevEco Studio 古话说得好&#xff0c;“磨刀不误砍柴工”&#xff0c;对于HarmonyOS应用开发&#xff0c;我们首先得确保工具齐全。这就好比要进行HarmonyOS应用开发&#xff0c;我们需要确保已经安装了DevEco Studio&#xff0c;这是HarmonyOS的一站式集成开发环境…

企业网架构

企业网架构 局域网通信不同网段 局域网通信 MAC地址&#xff1a;硬件地址&#xff0c;固定在网卡上的地址(唯一标识一个网卡)&#xff0c;确定网络设备位置的,数据链路层。一个设备可以有多个网卡&#xff0c;每一个网卡都需要一个唯一MAC。ARP协议&#xff1a;通过目的IP&…

leetcode刷题(剑指offer) 287.寻找重复数

287.寻找重复数 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改…

LeetCode 46. 全排列

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#…

Ddosify 作为压测工具的使用指南

文章目录 1. 写在最前面1.1 Kubernetes 监控1.2 Performance Testing 2. 命令行安装 & 使用2.1 安装2.2 使用2.2.1 默认的例子2.2.2 定制的例子 3. Dashboard 安装 & 使用3.1 安装3.2 使用3.2.1 简单使用3.2.3 依赖的服务介绍 4. 碎碎念5. 参考资料 1. 写在最前面 由于…

Docker-Jenkins编译android-app的两种方案

Docker-Jenkins编译android-app的两种方案 android开发使用jenkins编译&#xff0c;自动集成修改点/自动命名/自动备份&#xff0c;将修改的apk发布到测试服务器发布网盘&#xff0c;而不需要用通讯工具传来传去。 jenkins用在互联网开发编译比较常见&#xff0c;如果android开…

C++ //练习 2.40 根据自己的理解写出Sales_data类,最好与书中的例子有所区别。

C Primer&#xff08;第5版&#xff09; 练习 2.40 练习 2.40 根据自己的理解写出Sales_data类&#xff0c;最好与书中的例子有所区别。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 struct Sales_data{std::string bookNo;…

charles mac抓包unknown问题

第一步&#xff1a;mac上安装Charles后&#xff0c;mac安装证书&#xff1a; 第二步&#xff1a;mac上信任证书 第三步&#xff1a;手机上安装证书 安装提示&#xff1a;电脑上通过help–>SSLProxying–> Install Charles Root Ceriticate on a Mobile Device or Remote …

SVN 常用命令

help —— 帮助 在使用过程中&#xff0c;可随时使用help命令查看各常用svn命令&#xff1a; svn helpcheckout —— 检出 svn checkout https://计算机名:8443/svn/仓库名/ 说明&#xff1a; 1、可缩写为&#xff1a; svn co https://计算机名:8443/svn/仓库名/ 2、844…

kubeadm 安装k8s集群后,master节点notready问题解决方案

使用kubeadm 安装k8s集群后&#xff0c;加载calico cni 网络组件后&#xff0c;master节点notready问题 表现为&#xff1a; 使用命令查看日志&#xff1a;journalctl -f -u kubelet 报错如下&#xff1a; Failed to start ContainerManager failed to initialize top level…

2024-01-22(MongoDB)

1.Mongodb使用的业务场景&#xff1a; 传统的关系型数据库/mysql在“三高”需求以及应对web2.0的网站需求面前&#xff0c;有点力不从心&#xff0c;什么是“三高”需求&#xff1a; a. 对数据库高并发的读写需求 b. 对海量数据的高效率存储和访问需求 c. 对数据库的高可扩…

实现VLAN之间的路由

原理&#xff1a;路由器子接口 一个接口允许多个VLAN通过&#xff08;避免占用物理路由器接口&#xff09;。 目标 第 1 部分&#xff1a;单臂路由 第 2 部分&#xff1a;配置第三层交换机的路由端口 第 3 部分&#xff1a;带SVI的VLAN间路由 第 4 部分&#xff1a;补充知…

苹果笔记本MacBook电脑怎么卸载软件?三种方法快速卸载软件

苹果笔记本MacBook电脑是一款非常流行的电脑&#xff0c;但是有时候我们可能需要卸载一些不需要的软件。下面是一些简单的步骤&#xff0c;可以帮助您在MacBook电脑上卸载软件。 苹果笔记本MacBook电脑怎么卸载软件&#xff1f;三种实用方法快速卸载软件&#xff01; 方法一&a…

【网络安全 -> 防御与保护】信息安全概述

目录 一、信息安全现状及挑战 二、信息安全脆弱性及常见安全攻击 1、网络环境的开放性 2、协议栈的脆弱性及常见攻击 3、操作系统的脆弱性及常见攻击 4、终端的脆弱性及常见攻击 5、其他常见攻击 三、信息安全要素 四、整体安全解决方案 一、信息安全现状及挑战 &…

【5G 接口协议】N2接口协议NGAP(NG Application Protocol)介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

图神经网络X项目|基于图神经网络的电商行为的预测(5%)

文章目录 Jupyter Notebook 学习人工智能的好帮手数据集数据集下载数据集调用数据集应用技巧——获取不重复的编号数据集应用技巧——随机采样数据集应用技巧——抽取前N项进行模拟测试 数据集构建技巧一——查看数据集构建进度 Jupyter Notebook 学习人工智能的好帮手 【Jupy…

(delphi11最新学习资料) Object Pascal 学习笔记---第3章第一节(简单语句与复合语句)

Object Pascal 学习笔记&#xff0c;Delphi 11 编程语言的完整介绍 作者: Marco Cantu 笔记&#xff1a;豆豆爸 3.1 简单语句与复合语句 ​ 编程指令通常称为语句。一个程序块可以由多个语句组成。有两种类型的语句&#xff0c;简单语句和复合语句。当语句不包含任何其他子语…

【XR806开发板试用】系列之一 - Linux环境下Ubuntu完全开发流程

前言 为了让极术社区开发者体验搭载安谋科技STAR-MC1处理器的面向IoT领域的全志XR806开发板&#xff0c;极术社区联合全志在线开发者社区共同推出XR806开发板免费试用活动。 极术社区特准备了200块XR806开发板作为2022年社区新年活动&#xff0c;申请的人数有600多&#xff0c…