Java设计模式之中介者(Mediator)模式

30 阅读3分钟

中介者(Mediator)模式通过引入一个中介者对象,来解决多个对象之间的紧密耦合关系,实现对象间的松散耦合关系。

什么是中介者模式

中介者(Mediator)模式是一种行为型设计模式,它通过引入一个中介者对象来解决多个对象之间的紧密耦合关系,从而提高系统的可扩展性和可维护性。中介者模式适用于多个对象之间存在复杂的相互依赖关系、需要进行协调和控制的场景。在中介者模式中,中介者对象可以将相关的对象间的直接依赖关系转化为逐级依赖关系,从而将各个对象间的关系变得更加松散,提高系统的灵活性和可维护性。

中介者模式的使用场景

  1. 当系统中多个对象之间存在复杂的相互依赖关系时,需要进行中介,将这些对象之间的耦合关系转化为逐级依赖关系,可以使用中介者模式。

  2. 当某个对象需要控制其它对象的行为,但不希望与这些对象直接交互时,也可以使用中介者模式。

  3. 当需要重用一组对象协作的代码片段,并在这个过程中对对象间的交互进行抽象时,可以使用中介者模式。

中介者模式的代码示例

在下面的示例中,我们将实现一个中介者模式来解决两个对象之间的依赖关系。一个人类 Person 有自己的姓名 name 和年龄 age 属性,并且可以向另一个人类对象 Greet 对象发送问候消息,并且另一个 Greet 对象可以将消息记录到日志中。

Person 类:

/**
 * 人类
 */
public class Person {
    private String name; // 姓名
    private int age; // 年龄
    private Mediator mediator; // 中介者
    
    public Person(String name, int age, Mediator mediator) {
        this.name = name;
        this.age = age;
        this.mediator = mediator;
    }
    
    /**
     * 向 Greet 对象发送问候消息
     * 
     * @param msg
     */
    public void say(String msg) {
        mediator.execute(this, msg);
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}

Greet 类:

/**
 * Greet 对象
 */
public class Greet {
    private List<String> log = new ArrayList<String>(); // 记录消息的日志
    
    /**
     * 记录消息至日志
     * 
     * @param msg
     */
    public void record(String msg) {
        log.add(msg);
    }
    
    public List<String> getLog() {
        return log;
    }
}

中介者 Mediator 接口:

/**
 * 中介者接口
 */
public interface Mediator {
    public void execute(Person person, String msg);
}

具体中介者 Mediator 实现:

/**
 * 具体中介者 Mediator 实现
 */
public class ConcreteMediator implements Mediator {
    private Greet greet; // Greet 对象
    
    public ConcreteMediator(Greet greet) {
        this.greet = greet;
    }
    
    public void execute(Person person, String msg) {
        greet.record(person.getName() + ": " + msg); // 将Greet对象记录个人的问候消息
    }
}

测试代码:

public class MediatorPatternDemo {
    public static void main(String[] args) {
        // 创建 Greet 对象和 Person 对象
        Greet greet = new Greet();
        Person john = new Person("John", 20, new ConcreteMediator(greet));
        Person mary = new Person("Mary", 19, new ConcreteMediator(greet));
        
        // John 对 Mary 说 hi
        john.say("Hi, nice to meet you!");
        
        // 查看记录的日志
        for (String log : greet.getLog()) {
            System.out.println(log);
        }
    }
}

运行结果:

John: Hi, nice to meet you!

中介者模式的实际应用

  1. Spring框架:Spring框架中的Context上下文,就是使用了中介者模式的设计。Context对象作为一个中介者,协调应用程序中的所有对象之间的交互关系,降低了对象之间的耦合。

  2. Java Swing:Java Swing在事件处理机制上使用了中介者模式,Swing把GUI组件都看作是事件发生的源头,每个GUI组件都有一个事件的监听器列表,当事件发生时,Swing框架使用中介者模式将事件分发给对应的监听器进行处理。

  3. Struts框架:Struts框架中的ActionServlet就是中介者,用来协调整个MVC框架中的请求处理和响应。

  4. Quartz框架:Quartz框架中的QuartzScheduler就是中介者,它协调整个Quartz框架中的任务调度和响应,降低了对象之间的耦合。

关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员👩‍💻👨‍💻!