中介者模式(Mediator)---行为型

 1 基础知识

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

本质:封装交互

使用场景:(1)如果一组对象之间的通信方式比较复杂,导致相互依赖、结构混乱,可以采用中介者模式,把这些对象相互的交互管理起来,各个对象都只需要和中介者交互,从而使得各个对象松散耦合,结构也更清晰易懂。

(2)如果一个对象引用很多的对象,并直接跟这些对象交互,导致难以复用该对象,可以采用中介者模式,把这个对象跟其他对象的交互封装到中介者对象里面,这个对象只需要和中介者对象交互就可以了。 

优点:

(1)松散耦合

    中介者模式通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互不依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样“牵一发而动全身”了。

(2)集中控制交互

    多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了,当然如果是已经做好的系统,那就扩展中介者对象,而各个同事类不需要做修改。

(3)多对多变成一对多

    没有使用中介者模式的时候,同事对象之间的关系通常是多对多的,引入中介者对象以后,中介者对象和同事对象的关系通常变成了双向的一对多,这会让对象的关系更容易理解和实现。

缺点:过度集中化。如果同事对象的交互非常多,而且比较复杂,当这些复杂性全部集中到中介者的时候,会导致中介者对象变得十分复杂,而且难于管理和维护。

 2 代码示例

使用场景:在qq群中,有许多个对象发信息,但都是在群中显示的,此时这个qq群就相当于一个中介者。

学习群:StudyGroup

public class StudyGroup {
    
    //展示每个对象发送的信息,并对信息做了封装
    public static void showMessage(User user,String message){
        System.out.println(new Date().toString()+"["+user.getName()+" "+"message: "+message+"]");
    }
}

用户对象:User

public class User {
    private String name;

    public User(String name){
        this.name = name;
    }
    //发送了一个消息,让中介者去展示
    public void sendMessage(String message){
        StudyGroup.showMessage(this,message);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

应用层:

public class Test {
    public static void main(String[] args) {
        User a = new User("a");
        User b = new User("b");

        a.sendMessage("123");
        b.sendMessage("456");
    }
}

4 相关模式

(1)中介者模式和外观模式

     这两个模式有相似的地方,也存在很大的不同外观模式多用来封装一个子系统内部的多个模块,目的是向子系统外部提供简单易用的接口。也就是说外观模式封装的是子系统外部和子系统内部模块间的交互;而中介者模式是提供多个平等的同事对象之间交互关系的封装,一般是用在内部实现上另外,外观模式是实现单向的交互,是从子系统外部来调用子系统内部,不会反着来;而中介者模式实现的是内部多个模块间多向的交互

(2)中介者模式和观察者模式

    这两个模式可以组合使用。中介者模式可以组合使用观察者模式,来实现当同事对象发生改变的时候,通知中介对象,让中介对象去进行与其他相关对象的交互。

原文地址:https://www.cnblogs.com/youngao/p/11401213.html