中介者模式,用一个中介对象去封装一系列对象的交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 Mediator类,抽象中介类:

abstract class Mediator{
    public abstract void Send(String message,Colleague colleague);
}

Colleague类,抽象同事类:

abstract class Colleague{
    protected Mediator mediator;
    public Colleague(Mediator mediator){
        this.mediator=mediator;
    }
}

ConcreteMediator类,具体中介类:

class ConcreteMediator extends Mediator{
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;
    public void Send(String message,Colleague colleague){
        if(colleague==colleague1){
            colleague2.Notify(message);
        }else{
            colleague1.Notify(message);
        }
    }
}

ConcreteColleague1和ConcreteColleague各种同事类:

class ConcreteColleague1 extends Colleague{
    public void Send(String message){
        mediator.Send(message,this);
    }
    public void Notify(String message){
        System.out.println("colleague1 handle "+message);
    }
}
class ConcreteColleague2 extends Colleague{
    public void Send(String message){
        mediator.Send(message,this);
    }
    public void Notify(String message){
        System.out.println("colleague2 handle "+message);
    }
}

客户端代码:

static void main(String[] args){
    ConcreteMediator m=new ConcreteMediator();
    ConcreteColleague1 c1=new ConcreteColleague1();
    ConcreteColleague2 c2=new ConcreteColleague2();
    m.colleague1=c1;
    m.colleague2=c2;
    c1.Send("A");
    c2.Send("B");
}

中介者模式优缺点:
优点:Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator,由于把对象如何协作进行了抽象,将中介作为一个独立的概念,并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上,也就是站在一个更宏观的角度去看待系统。

缺点:由于ConcreteMediator控制集中化,于是就把交互的复杂性变为了中介者的复杂性,这就使得ConcreteMediator比任何一个ConcreteColleague都复杂。