Java描述设计模式(17):调停者模式
本文源码:GitHub·点这里 || GitEE·点这里
一、生活场景
1、场景描述
在公司的日常安排中,通常划分多个部门,每个部门又会分为不同的小组,部门经理的一项核心工作就是协调部门小组之间的工作,例如开发小组,产品小组,小组的需求统一汇总到经理,经理统一安排和协调。
2、场景图解
3、代码实现
public class C01_InScene { public static void main(String[] args) { Manager manager = new Manager() ; EmployeeA employeeA = new EmployeeA("张三",manager) ; EmployeeB employeeB = new EmployeeB("李四",manager) ; employeeA.sendMsg(employeeA.name,"需要产品文档",employeeB); } } /** * 部门协调接口 */ interface Department { void coordinate (String userName,String msg,Employee employee) ; } /** * 部门经理 */ class Manager implements Department { @Override public void coordinate (String userName,String msg,Employee employee) { System.out.println("经理接收【"+userName+"】的协调任务:" + msg); System.out.println("经理转发【"+userName+"】协调任务,@【"+employee.name+"】"); employee.getMsg(userName,msg); } } /** * 员工抽象类 */ abstract class Employee { public String name ; private Department department ; public Employee (String name,Department department){ this.name = name ; this.department = department ; } public void getMsg (String userName,String msg){ System.out.println("【"+this.name+"】收到"+"【"+userName+"】协调任务:["+msg+"]"); } public void sendMsg (String name,String msg,Employee employee){ System.out.println("【"+name+"】发起协调任务:"+ msg); department.coordinate(name,msg,employee); } } /** * 具体员工 */ class EmployeeA extends Employee { public EmployeeA(String name, Department department) { super(name, department); } } class EmployeeB extends Employee { public EmployeeB(String name, Department department) { super(name, department); } }
执行结果
【张三】发起协调任务:需要产品文档 经理接收【张三】的协调任务:需要产品文档 经理转发【张三】协调任务,@【李四】 【李四】收到【张三】协调任务:[需要产品文档]
二、调停者模式
1、基本概念
调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互显式引用,通过一个中介对象进行引用通知,从而对象之间解耦。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的对象间的相互作用。保证这些相互作用可以彼此独立地变化。
2、模式图解
3、核心角色
- 抽象调停者角色
定义出同事对象到调停者对象的接口,其中主要方法是一个或多个事件方法。
- 具体调停者角色
实现了抽象调停者所声明的事件方法。具体调停者持有所有的具体同事类,并负责协调各具体同事对象的交互信息。
- 抽象同事类角色
定义出调停者到同事对象的接口。同事对象只持有调停者而不知道具体的同事对象。
- 具体同事类角色
所有的具体同事类均从抽象同事类继承而来,需要与其他同事通信的时候,就与持有的调停者通信,调停者会负责与其他的同事对象交互。
4、源码实现
/** * 抽象调停者类 */ interface Mediator { void notify (Colleague colleague); } /** * 抽象同事类 */ abstract class Colleague { /* 持有调停者对象 */ private Mediator mediator; public Colleague(Mediator mediator){ this.mediator = mediator; } public Mediator getMediator(){ return mediator; } } /** * 具体调停者类 */ class ConcreteMediator implements Mediator{ private ConcreteColleagueA colleagueA ; private ConcreteColleagueB colleagueB ; public void setColleagueA(ConcreteColleagueA colleagueA) { this.colleagueA = colleagueA; } public void setColleagueB(ConcreteColleagueB colleagueB) { this.colleagueB = colleagueB; } @Override public void notify(Colleague colleague) { System.out.println("协调通知消息"); } } /** * 具体同事类 */ class ConcreteColleagueA extends Colleague{ public ConcreteColleagueA(Mediator mediator) { super(mediator); } public void operate(){ getMediator().notify(this); } } class ConcreteColleagueB extends Colleague{ public ConcreteColleagueB(Mediator mediator) { super(mediator); } public void operation(){ getMediator().notify(this); } }
三、调停者模式总结
- 松散耦合
调停者模式通过把多个同事对象之间的交互封装到调停者对象里面,从而使得同事对象之间松散耦合。
- 集中管理交互
多个同事对象的交互,被封装在调停者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改调停者对象就可以了。
- 简化对象间关系
没有使用调停者模式的时候,同事对象之间的关系通常是多对多的,引入调停者对象以后,调停者对象和同事对象的关系通常变成双向的一对多。
- 模式的缺点
调停者模式的一个潜在缺点是,过度集中化,当同事对象很多,交互非常、复杂时,会导致调停者对象变得十分复杂,而且难于管理和维护。
四、源代码地址
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
常见数据结构的 Python 实现(建议收藏)
数据结构作为计算机基础的必修内容,也是很多大型互联网企业面试的必考题。可想而知,它在计算机领域的重要性。 然而很多计算机专业的同学,都仅仅是了解数据结构的相关理论,却无法用代码实现各种数据结构。 栈 class Stack(object): def __init__(self, limit=10): self.stack = [] #存放元素 self.limit = limit #栈容量极限 def push(self, data): #判断栈是否溢出 if len(self.stack) >= self.limit: print('StackOverflowError') pass self.stack.append(data) def pop(self): if self.stack: return self.stack.pop() else: raise IndexError('pop from an empty stack') #空栈不能被弹出 def peek(self): #查看堆栈的最上面的元素 if self.stack: return self.stack[-...
- 下一篇
LeetCode 387: 字符串中的第一个唯一字符 First Unique Character in a String
题目: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1. 案例: s = "leetcode" 返回 0. s = "loveleetcode", 返回 2. 注意事项:您可以假定该字符串只包含小写字母。 Note: You may assume the string contain only lowercase letters. 解题思路: 很简单的题,无非就是对字符串的字母进行频率统计,找到出现频率为1 的字母索引。 借助哈希映射两次遍历完成。第一次遍历进行字母频率统计,Hash Map 的Key 为字母,Value 为出现频率。第二次遍历找到频率为 1 的字母索引返回即可。 不同于单词频率统计,字母一共只有 26 个,所以可以直接利用 ASii 码表里小写字母数值从 97~122,直接用 int 型数组...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果