【设计模式 - 17】之中介者模式(Mediator)
1、模式简介
中介者模式的定义:
用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显式地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
中介者模式中的组成部分:
- 同事类:如果两个类对象之间可以彼此影响,则称这两个类为同事类;
- 中介者:中介者中有所有同事类的引用,定义了各个同事类之间交互的抽象方法。
中介者模式的工作方式:
如下两幅图所示,有6个同事类,它们之间的交互方式如下图所示。这样的话,当对象1发生变化,将影响对象2、4、5、6;当对象2发生变化时,将影响对象1、3、4、5、6。这样不仅实现起来麻烦,而且不易于维护。
如果引入中介者,其工作情况将如下图所示。可以看到,同事类之间两两都没有了关联,都是与中介者联系了。
中介者模式的优点:
- 降低了类的复杂度,将一对多转化成了一对一;
- 各个类之间的解耦;
- 符合对象之间“高内聚、低耦合”的原则。
中介者模式的缺点:
中介者会庞大,变得复杂难以维护。
中介者模式的使用场景:
- 当系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象时;
- 当希望通过一个中间类来封装多个类中的行为,而又不想生成太多的子类时。
2、案例
在这个案例中,我们模拟一个聊天室的功能:
- 创建一个聊天室;
- 向聊天室中添加用户;
- 当某一个用户发布消息的时候,其他用户都可以收到消息。
具体代码如下:
用户类User中的代码:
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void sendMessage(ChatRoom chatRoom, String message) {
System.out.println(name + "发出消息:" + message);
chatRoom.operateMessage(new Message(this, message));
}
}
消息类Message中的代码:
public class Message {
private User fromUser;
private String content;
public Message() {
}
public Message(User fromUser, String content) {
this.fromUser = fromUser;
this.content = content;
}
public User getFromUser() {
return fromUser;
}
public void setFromUser(User fromUser) {
this.fromUser = fromUser;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
聊天室类ChatRoom中的代码:
public class ChatRoom {
private List<User> users;
public ChatRoom() {
System.out.println("聊天室开启!!");
users = new ArrayList<User>();
}
public void addUser(User user) {
System.out.println(user.getName() + "加入了聊天室!");
users.add(user);
}
public void operateMessage(Message message) {
User fromUser = message.getFromUser();
for (User user : users) {
if (fromUser != user) {
System.out.println(user.getName() + "收到了来自" + fromUser.getName() + "的消息:" + message.getContent());
}
}
}
}
测试类Test中的代码:
public class Test {
public static void main(String[] args) {
// 初始化聊天室对象
ChatRoom chatRoom = new ChatRoom();
// 向聊天室中添加用户
User chatter1 = new User("Chatter1");
User chatter2 = new User("Chatter2");
User chatter3 = new User("Chatter3");
User chatter4 = new User("Chatter4");
User chatter5 = new User("Chatter5");
User chatter6 = new User("Chatter6");
chatRoom.addUser(chatter1);
chatRoom.addUser(chatter2);
chatRoom.addUser(chatter3);
chatRoom.addUser(chatter4);
chatRoom.addUser(chatter5);
chatRoom.addUser(chatter6);
System.out.println();
// 用户之间开始交流
chatter1.sendMessage(chatRoom, "大家好,我是Chatter1");
System.out.println();
chatter4.sendMessage(chatRoom, "你好,Chatter1");
}
}
运行结果如下图所示:
最后贴出中介者模式的GitHub代码地址:【GitHub - Mediator】。
【设计模式 - 17】之中介者模式(Mediator)的更多相关文章
- 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...
- 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- java设计模式-----17、中介者模式
概念: Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种.Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中, ...
- 《JAVA设计模式》之中介者模式(Mediator)
在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: 调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从 ...
- 第17章 中介者模式(Mediator Pattern)
原文 第17章 中介者模式(Mediator Pattern) 中介者模式 概述: 在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进 ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...
- 大话设计模式Python实现-中介者模式
中介者模式(Mediator Pattern):用一个对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使耦合松散,而且可以独立地改变它们之间的交互. 下面是一个中介者模式的demo ...
- Java设计模式系列之中介者模式
中介者模式(Mediator)的定义 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式(Mediator)的适 ...
随机推荐
- C++ 静态、动态链接库的简单实现
一.什么是静态链接库,什么是动态链接库? 1.静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些.在静态库情况下,函数和数据被编译进 ...
- Java之字符串学习
java中String的使用十分频繁,是我们要学习的重点,在说String之前,我们要知道堆跟栈的区别. java中的数据类型分原生数据类型(primitived types)有八种(byte,cha ...
- 解决GDB输出Qt内置类型的显示问题
自从GDB 7.0之后,就加入了Pretty-Printer的这个概念.简单理解就是他可以让你用Python写一串脚本,然后让gdb去读取这串脚本后,可以自由的输出由你想自己定义的格式.我们直接举个简 ...
- Hibernate 使用说明
Eclipse中hibernate连接mySQL数据库练习(采用的是hibernate中XML配置方式连接数据库,以后在更新其他方式的连接) Hibernate就是Java后台数据库持久层的框架,也是 ...
- php邮箱找回密码功能
原理很简单: 用户找回密码的时候,填写用户名,程序得到用户名便可以去数据库取出用户对应的密码以及当时填写的邮箱, 根据用户名和密码生成一个key=md5(username+password),然后$s ...
- winfrom拷贝文件
//File.Copy(@"C:\Users\Administrator\Pictures\bg.png", @"g:\images\bg.png", true ...
- iOS MD5加密算法
考虑到用户账户安全,对用户的登录密码进行MD5加密 什么是MD5加密呢...懒了就不在这搬砖了,大家可以自己搜索查查,在此记录下代码,以供以后学习查询! 下面,直接上代码... // 需要倒入这个头文 ...
- 自己总结的一些android公共库
本文主要介绍自己在android开发中总结的一些公共库,目前包括下拉刷新ListView.可以响应各个方向CompoundDrawables点击操作的TextView.图片缓存,不断更新,欢迎交流 ? ...
- 【Java】Java Platform
The Java platform has two components: The Java Virtual Machine The Java Application Programming Inte ...
- 【Java】数据库连接池技术
JDBC的问题 在程序中,我们经常要建立与数据库的连接,之后再关闭这个连接.我们知道,数据库连接对象的创建是比较消耗系统性能的,这些频繁的操作势必会消耗大量的系统资源.因此我们需要采用更高效的数据库访 ...