首先我们了解下设计模式的总览:
GoF提出的设计模式总共有23种,根据目的准则分类分为三大类:
创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
中介者模式,Mediator Pattern 用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显示地相互引用,从而使其耦合松散,可以独立地改变他们之间的交互。
先摆结论:
中介者模式的优缺点和使用场景
优点
符合迪米特原则,将原有的一对多的依赖变成了一对一的依赖,降低类间的耦合。
缺点
中介者会变得庞大且复杂,原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系,同事类越多,中介者的逻辑就越复杂。
使用场景
中介者模式很容易实现呢,但是也容易误用,不要着急使用,先要思考你的设计是否合理。
当对象之间的交互变多时,为了防止一个类会涉及修改其他类的行为,可以使用中介者模式,将系统从网状结构变为以中介者为中心的星型结构。
如下例子为,武林中门派众多,矛盾也很多。假定武林盟主是武当派,然后华山派和嵩山派出现了矛盾,需要找武当派这么盟主主持公道。我们中间抽取出一个中介形成沟通的桥梁。
再上代码:
//抽象武林联盟 中介
public abstract class WuLinAlliance {
public abstract void notice(String str,MenPai menpai);
}
//抽象门派的类别
public abstract class MenPai {
protected WuLinAlliance wuLinAlliance;
public MenPai(WuLinAlliance wuLinAlliance) {
this.wuLinAlliance = wuLinAlliance;
}
}
public class HuaShanPai extends MenPai{
public HuaShanPai(WuLinAlliance wuLinAlliance) {
super(wuLinAlliance);
}
public void sendAlliance(String str){
wuLinAlliance.notice(str,this);
}
public void getNotice(String str){
System.out.println("华山派收到了消息......"+str);
}
}
public class SongshanPai extends MenPai{
public SongshanPai(WuLinAlliance wuLinAlliance) {
super(wuLinAlliance);
}
public void sendAlliance(String str){
wuLinAlliance.notice(str,this);
}
public void getNotice(String str){
System.out.println("嵩山派收到了消息......"+str);
}
}
//假定 武当派是联盟盟主
public class WuDangPai extends MenPai{
public WuDangPai(WuLinAlliance wuLinAlliance) {
super(wuLinAlliance);
}
public void sendAlliance(String str){
wuLinAlliance.notice(str,this);
}
public void getNotice(String str){
System.out.println("武当派收到了消息......"+str);
}
}
//协调者就是实际做事情,协调各个类,各个门派通知的
public class Mediator extends WuLinAlliance{
private HuaShanPai huaShanPai;
private SongshanPai songshanPai;
private WuDangPai wuDangPai;
public void setHuaShanPai(HuaShanPai huaShanPai) {
this.huaShanPai = huaShanPai;
}
public void setSongshanPai(SongshanPai songshanPai) {
this.songshanPai = songshanPai;
}
public void setWuDangPai(WuDangPai wuDangPai) {
this.wuDangPai = wuDangPai;
}
@Override
public void notice(String str, MenPai menpai) {
if(menpai == huaShanPai){
wuDangPai.getNotice(str);
}else if (menpai == songshanPai){
wuDangPai.getNotice(str);
}else if (menpai == wuDangPai){
huaShanPai.getNotice(str);
songshanPai.getNotice(str);
}
}
}
测试代码:
public class Test {
public static void main(String[] args) {
Mediator mediator = new Mediator();
HuaShanPai huaShanPai = new HuaShanPai(mediator);
SongshanPai songshanPai = new SongshanPai(mediator);
WuDangPai wuDangPai = new WuDangPai(mediator);
mediator.setHuaShanPai(huaShanPai);
mediator.setSongshanPai(songshanPai);
mediator.setWuDangPai(wuDangPai);
huaShanPai.sendAlliance("华山派令狐被冤枉,误杀了嵩山派大弟子");
songshanPai.sendAlliance("嵩山派大弟子被华山派令狐冲故意杀害,请主持公道");
wuDangPai.sendAlliance("武当派作为盟主,定会查出真相");
}
}
输出结果如下:
武当派收到了消息......华山派令狐被冤枉,误杀了嵩山派大弟子
武当派收到了消息......嵩山派大弟子被华山派令狐冲故意杀害,请主持公道
华山派收到了消息......武当派作为盟主,定会查出真相
嵩山派收到了消息......武当派作为盟主,定会查出真相