该项目源码地址:https://github.com/lastwhispers/code/tree/master/java-basic/design-pattern
(设计模式相关代码与笔记)
1. 定义
定义一个封装一组对象如何交互的对象(通过使对象明确地相互引用来促进松散耦合,并允许独立地改变它们的交互)
2. 适用场景
- 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解
- 交互的公共行为,如果需要改变行为则可以增加新的中介者类
应用例子:聊天室
3. 类图与角色
它主要包含如下几个角色:
Mediator:抽象中介者。定义了同事对象到中介者对象之间的接口。
ConcreteMediator:具体中介者。实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
Colleague:抽象同事类。
ConcreteColleague:具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
在中介者模式中中介者对象处于核心地位,因为它定义了整个系统中所有具体同事类之间的关系。在整个系统中它主要承担两个方面的责任:
1、 结构上起到中转作用。通过中介者对象对关系的封装,使得具体的同事类不再需要显示的引用其他对象,它只需要通过中介者就可以完成与其他同事类之间的通信。
2、 行为上起到协作作用。中介者对同事类之间的关系进行封装,同事类在不需要知道其他对象的情况下通过中介者与其他对象完成通信。在这个过程中同事类是不需要指明中介者该如何做,中介者可以根据自身的逻辑来进行协调,对同事的请求进一步处理,将同事成员之间的关系行为进行分离和封装。
同时由于中介者对对象的关系进行了封装,使得各个同事类之间的耦合减少了,使得他们可以独立改变和复用。
4. 相关设计模式
中介者模式和观察者模式
观察者模式来实现中介者模式中的角色之间的通讯
5. 模式实例
背景:聊天室聊天
(1)ConcreteColleague 用户类
发送消息的时候,就是通过中介者来进行发送
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public void sendMessage(String message) {
StudyGroup.showMessage(this,message);
}
}
(2)ConcreteMediator 中介者
public class StudyGroup {
public static void showMessage(User user, String message) {
System.out.println(new Date().toString()+"["+user.getName()+"]:"+message);
}
}
(3)测试
public class Test {
public static void main(String[] args) {
User tom = new User("ldc");
User jack = new User("ghl");
tom.sendMessage("hey!jack");
jack.sendMessage("hey!tom");
}
}
测试结果:
6. 优缺点
优点:
- 将一对多转化成了一对一、降低程序复杂度
- 类之间解耦
缺点:
- 中介者过多,导致系统复杂
7. 扩展-JDK1.7源码以及框架中的中介者模式
java.util.Timer就是一个中介者,TimerTask就是user(同事类),通过sched进行协调