一、定义与类型:
》定义一个封装一组对象如何交互的对象
》通过使对象明确地相互引用来促进松散耦合,并允许独立地改变它们的交互;
》类型:行为型
二、适用场景:
》系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱难以理解;
》交互的公共行为,如果需要改变行为则可以增加新的中介者类。
通常用于聊天室等
三、优点:
》将一对多转化成了一对一、降低程序复杂度
》类之间解耦
四、缺点:
》中介者过多,导致系统复杂
五、中介者模式相关设计模式:
》中介者模式和观察者模式:观察者模式用来实现中介者模式之间的通信。
六、代码实践:
场景:所有的课程都有一个学习群,每个群里,小伙伴可以在其中交流。
studyGroup会在群里显示不同小伙伴发言,
package pattern.behaviral.mediator;
/**
* Created by Administrator on 2019/8/31.
*/
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void sendMessage(String message){
StudyGroup.showMessage(this,message);
}
}
package pattern.behaviral.mediator;
import java.util.Date;
/**
* Created by Administrator on 2019/8/31.
*/
public class StudyGroup {
public static void showMessage(User user,String message){
System.out.println(new Date().toString()+"["+user.getName()+"]"+message);
}
}
package pattern.behaviral.mediator;
import javax.jws.soap.SOAPBinding;
/**
* Created by Administrator on 2019/8/31.
*/
public class Test {
public static void main(String[] args) {
User geely = new User("Geely");
User tom = new User("Tom");
geely.sendMessage("Hey,Tom! Let's study design ");
tom.sendMessage("ok! Geely");
}
}
"D:\Program Files\Java\jdk1.8.0_102\bin\java" "-javaagent:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\lib\idea_rt.jar=58132:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_102\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar;E:\JavaDesignMode\target\classes" pattern.behaviral.mediator.Test
Sat Aug 31 23:54:29 CST 2019[Geely]Hey,Tom! Let's study design
Sat Aug 31 23:54:29 CST 2019[Tom]ok! Geely
Process finished with exit code 0
七、中介者模式源码解读:
》jdk中的Timer 计时器中有涉及。schedule方法的使用,最后调用的都是sched(0方法
sched()中的参数为TimerTask,里面是不同的待执行的任务,使用到了queue,其中的Queue 是个taskqueue类型。
Timer就是个中介者,timerTasK就是个被协调的任务