【设计模式 - 17】之中介者模式(Mediator)
来源:互联网 发布:centos下lamp环境搭建 编辑:程序博客网 时间:2024/05/01 16:26
1 模式简介
中介者模式的定义:
用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显式地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
中介者模式中的组成部分:
1. 同事类:如果两个类对象之间可以彼此影响,则称这两个类为同事类;
2. 中介者:中介者中有所有同事类的引用,定义了各个同事类之间交互的抽象方法。
中介者模式的工作方式:
如下两幅图所示,有6个同事类,它们之间的交互方式如下图所示。这样的话,当对象1发生变化,将影响对象2、4、5、6;当对象2发生变化时,将影响对象1、3、4、5、6。这样不仅实现起来麻烦,而且不易于维护。
如果引入中介者,其工作情况将如下图所示。可以看到,同事类之间两两都没有了关联,都是与中介者联系了。
中介者模式的优点:
1) 降低了类的复杂度,将一对多转化成了一对一;
2) 各个类之间的解耦;
3) 符合对象之间“高内聚、低耦合”的原则。
中介者模式的缺点:
中介者会庞大,变得复杂难以维护。
中介者模式的使用场景:
1) 当系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象时;
2) 当希望通过一个中间类来封装多个类中的行为,而又不想生成太多的子类时。
2 案例
在这个案例中,我们模拟一个聊天室的功能:
1) 创建一个聊天室;
2) 向聊天室中添加用户;
3) 当某一个用户发布消息的时候,其他用户都可以收到消息。
具体代码如下:
用户类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)
- 设计模式之中介者模式,mediator
- 设计模式之中介者模式(Mediator)
- 设计模式之中介者模式(Mediator)
- 设计模式之中介者模式Mediator
- 设计模式之中介者模式(Mediator)
- 设计模式之17 - 中介者模式Mediator
- 设计模式 17 - Mediator中介者模式
- 设计模式(17) - Mediator中介者模式
- 设计模式之(十七)中介者模式(mediator)
- 23种设计模式之中介者模式(Mediator)
- 设计模式之Mediator(中介者)模式(理论篇)
- 设计模式之Mediator(中介者)模式(应用篇)
- C++设计模式之十七:Mediator(中介者模式)
- 设计模式之中介者模式(Mediator)
- 设计模式之中介者模式(Mediator)
- caffe ubuntu16.04 cuda8.0 cudnnv4
- Spring笔记(第二弹:搭建第一个Spring工程)
- order by 1 与 order by 列名
- 英语口语收集(三十)
- 英语口语收集(三十一)
- 【设计模式 - 17】之中介者模式(Mediator)
- 重复元素全排列
- http缓存提高性能
- 打印乘法口诀表
- 英语口语收集(三十二)
- NG《Machine_Learning_Yearning》笔记
- Ubuntu安装微信教程 超简单的
- 交换两个整型变量的值
- 英语口语收集(三十三)