中介者模式

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

中介者模式_第1张图片
中介者模式的结构图

中介者模式中的角色:

  • Mediator:抽象中介者,定义了同事对象到中介者对象的接口。
  • ConcreteMediator:具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
  • Colleague:抽象同事类。
  • ConcreteColleague:具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者模式。

中介者模式的简单实现

(1)抽象中介者

public abstract class Mediator {

    public abstract void send(String message, Colleague colleague);
}

(2)具体中介者对象

public class ConcreteMediator extends Mediator {

    private ConcreteColleague1 concreteColleague1;
    private ConcreteColleague2 concreteColleague2;

    public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
        this.concreteColleague1 = concreteColleague1;
    }

    public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
        this.concreteColleague2 = concreteColleague2;
    }

    @Override
    public void send(String message, Colleague colleague) {
        if (colleague == concreteColleague1) {
            concreteColleague2.notify(message);
        } else {
            concreteColleague1.notify(message);
        }
    }
}

(3)抽象同事类

public class ConcreteColleague1 extends Colleague {

    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    public void send(String message) {
        mediator.send(message, this);
    }

    public void notify(String message) {
        System.out.println("同事1接收到消息:" + message);
    }
}
public class ConcreteColleague2 extends Colleague {

    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    public void send(String message) {
        mediator.send(message, this);
    }

    public void notify(String message) {
        System.out.println("同事2接收到消息:" + message);
    }
}

(4)客户端调用

public class Client {

    public static void main(String[] args) {
        ConcreteMediator concreteMediator = new ConcreteMediator();

        ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(concreteMediator);
        ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(concreteMediator);

        concreteMediator.setConcreteColleague1(concreteColleague1);
        concreteMediator.setConcreteColleague2(concreteColleague2);

        concreteColleague1.send("吃饭没?");
        concreteColleague2.send("没有那,你请客?");
    }
}

(5)输出

同事2接收到消息:吃饭没?
同事1接收到消息:没有那,你请客?

中介者模式的使用场景

使用场景:
一组定义良好的对象,现在要进行复杂的相互通信。
想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

中介者模式的优缺点

优点:
简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变得松耦合。
提供系统的灵活性,使得各个同事对象独立而易于复用。

缺点:
中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
新增一个同事类时,不得不去修改抽象中介者和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

你可能感兴趣的:(中介者模式)