中介者模式
中介者模式的三个参与者:
(1)中介者接口:mediator
(2)中介者实现类:concreteMediator
(3)同事:colleague
应用场景
若有多个对象之间,相互调用,请求复杂
那么可以考虑引入一个“中介”,多个对象都与中介进行联系,不需要互相调用,松耦合,让代码更健壮。可以把上面的网状结构梳理为下面的星形结构。
代码示例
中介者抽象类,定义接口,同事列表
public abstract class Mediator {
// 中介者维护同事间的一个列表
ColleagueA colleagueA;
ColleagueB colleagueB;
ColleagueC colleagueC;
public void setColleagueA(ColleagueA colleagueA) {
this.colleagueA = colleagueA;
}
public void setColleagueB(ColleagueB colleagueB) {
this.colleagueB = colleagueB;
}
public void setColleagueC(ColleagueC colleagueC) {
this.colleagueC = colleagueC;
}
//中介者必须具备在同事之间处理逻辑、分配任务、促进交流的操作
public abstract void sayMsg();
}
中介者实现类
public class ConcreteMediator extends Mediator{
@Override
public void sayMsg() {
super.colleagueA.doSelf();
super.colleagueB.doSelf();
super.colleagueC.doSelf();
}
}
抽象同事类
public abstract class AbstractColleague {
// 同事间都认识中介者
protected Mediator mediator;
public AbstractColleague(Mediator mediator){
this.mediator = mediator;
}
// 做自己独立的事情
public abstract void doSelf();
// 做依赖其他同事的事情
public abstract void doDep();
}
具体同事类
public class ColleagueA extends AbstractColleague{
public ColleagueA(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
@Override
public void doSelf() {
System.out.println("ColleagueA ---doSelf");
}
@Override
public void doDep() {
super.mediator.sayMsg();
}
}
public class ColleagueB extends AbstractColleague{
public ColleagueB(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
@Override
public void doSelf() {
System.out.println("ColleagueB ---doSelf");
}
@Override
public void doDep() {
super.mediator.sayMsg();
}
}
public class ColleagueC extends AbstractColleague{
public ColleagueC(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
@Override
public void doSelf() {
System.out.println("ColleagueC ---doSelf");
}
@Override
public void doDep() {
super.mediator.sayMsg();
}
}
测试类:
public class Test {
public static void main(String[] args) {
ConcreteMediator concreteMediator = new ConcreteMediator();
ColleagueA colleagueA = new ColleagueA(concreteMediator);
ColleagueB colleagueB = new ColleagueB(concreteMediator);
ColleagueC colleagueC = new ColleagueC(concreteMediator);
//中介者有各个同事的列表
concreteMediator.setColleagueA(colleagueA);
concreteMediator.setColleagueB(colleagueB);
concreteMediator.setColleagueC(colleagueC);
System.out.println("*********************");
colleagueA.doSelf();
System.out.println("*********************");
colleagueA.doDep();
}
}
输出结果
*********************
ColleagueA ---doSelf
*********************
ColleagueA ---doSelf
ColleagueB ---doSelf
ColleagueC ---doSelf