一、定义
中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
此模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
二、UML类图
三、实现
- 抽象同事类
package com.jthao.design.des.mediator;
public abstract class Colleague {
protected Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void operation();
}
- 具体同事类A
package com.jthao.design.des.mediator;
public class ConcreteColleagueA extends Colleague {
public void notifyColleagueB() {
mediator.notifyColleagueB();
}
@Override
public void operation() {
System.out.print("this is ConcreteColleagueA's operation\n");
}
}
- 具体同事类B
package com.jthao.design.des.mediator;
public class ConcreteColleagueB extends Colleague {
public void notifyColleagueA() {
mediator.notifyColleagueA();
}
@Override
public void operation() {
System.out.print("this is ConcreteColleagueB's operation\n");
}
}
- 抽象中介者类
package com.jthao.design.des.mediator;
public abstract class Mediator {
protected Colleague colleagueA;
protected Colleague colleagueB;
public Mediator(Colleague colleagueA, Colleague colleagueB) {
this.colleagueA = colleagueA;
this.colleagueB = colleagueB;
}
public abstract void notifyColleagueA();
public abstract void notifyColleagueB();
}
- 具体中介者类
package com.jthao.design.des.mediator;
public class ConcreteMediator extends Mediator {
public ConcreteMediator(Colleague colleagueA, Colleague colleagueB) {
super(colleagueA, colleagueB);
}
@Override
public void notifyColleagueA() {
if (colleagueA != null) {
colleagueA.operation();
}
}
@Override
public void notifyColleagueB() {
if (colleagueB != null) {
colleagueB.operation();
}
}
}
- 测试类
package com.jthao.design.des.mediator;
public class Test {
public static void main(String[] args) {
Colleague colleagueA = new ConcreteColleagueA();
Colleague colleagueB = new ConcreteColleagueB();
Mediator mediator = new ConcreteMediator(colleagueA, colleagueB);
colleagueA.setMediator(mediator);
colleagueB.setMediator(mediator);
((ConcreteColleagueA) colleagueA).notifyColleagueB();
((ConcreteColleagueB) colleagueB).notifyColleagueA();
}
}