【设计模式 - 17】之中介者模式(Mediator)
2016-12-22 14:40
495 查看
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】。
相关文章推荐
- 23种设计模式(17)_行为型_中介者模式(Mediator Pattern)
- 设计模式之17 - 中介者模式Mediator
- 【HeadFirst 设计模式学习笔记】17 中介者(Mediator)模式拾零
- [设计模式] 17 中介者模式 Mediator Pattern
- 设计模式(17)-行为型-中介者模式(Mediator)
- 设计模式(17)——中介者 Mediator
- 【设计模式 - 17】之中介者模式(Mediator)
- [导入]C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式.zip(8.75 MB)
- Net设计模式实例之中介者模式(Mediator Pattern)(1) 推荐
- 设计模式----Mediator(中介者)模式
- Net设计模式实例之中介者模式(Mediator Pattern)(2)
- 设计模式笔记(17)---中介者模式(行为型)
- C#面向对象设计模式纵横谈 学习笔记17 Mediator 中介者模式(行为型模式)
- 设计模式之中介者模式(Mediator)
- 设计模式与泡mm的关系之Mediator中介者模式及再思考
- 设计模式笔记(17)---中介者模式(行为型)
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- 设计模式——中介者模式(Mediator)
- 设计模式袖珍版 连续转载之 - Mediator(中介者)
- 设计模式之Mediator(中介者)