天天看点

设计模式-行为型模式:中介者模式1、简介2、组成部分3、优缺点4、使用场景5、代码实现

目录

1、简介

2、组成部分

3、优缺点

4、使用场景

5、代码实现

1、简介

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过将对象间的交互行为集中到一个中介对象中,来降低对象间的耦合度,使对象间的通信更加简单。在中介者模式中,各个对象不再直接相互引用,而是通过中介者对象来协调它们的行为。

2、组成部分

中介者模式由以下几个部分组成:

  1. 抽象中介者(Mediator):定义了中介者对象的接口,负责定义对象间的通信协议。
  2. 具体中介者(Concrete Mediator):实现了中介者接口,负责协调各个同事对象之间的交互关系。
  3. 抽象同事类(Colleague):定义了同事对象的接口,负责定义对象间的行为。
  4. 具体同事类(Concrete Colleague):实现了同事接口,负责实现具体的行为。

在中介者模式中,各个同事类不再直接相互引用,而是通过中介者对象来进行通信。当一个同事对象需要与另一个同事对象进行通信时,它并不直接与目标对象通信,而是将请求发送给中介者对象,由中介者对象来处理请求,并将请求转发给目标对象。这样,各个同事对象之间的通信变得更加简单,而且不需要了解彼此的实现细节。

3、优缺点

中介者模式的优点包括:

  1. 降低了对象间的耦合度,使得对象间的通信更加简单。由于中介者对象将对象间的通信集中到一起处理,因此各个对象之间不需要直接相互通信,从而降低了它们之间的耦合度。这使得系统更加灵活,可以更方便地修改、扩展和维护。
  2. 可以减少子类的数量,减少了系统的复杂度。在不使用中介者模式的情况下,多个对象之间的交互可能会相互关联,需要通过建立大量的子类来实现各种不同的交互行为。而使用中介者模式后,各个对象之间的交互将被统一管理,不再需要建立大量的子类,从而减少了系统的复杂度。
  3. 可以更好地控制对象间的交互行为,使得系统更加灵活。由于中介者对象可以统一管理对象间的交互行为,因此可以更方便地控制各个对象之间的交互方式和时机,从而使得系统更加灵活。

中介者模式的缺点包括:

  1. 中介者对象可能变得非常复杂,难以维护和扩展。由于中介者对象需要处理各种不同的交互行为,因此可能会变得非常复杂,难以维护和扩展。此时需要设计合理的中介者对象,使其尽可能简单和易于维护。
  2. 中介者对象会成为系统的瓶颈,影响系统的性能。由于中介者对象需要处理各种不同的交互行为,因此可能会成为系统的瓶颈,影响系统的性能。此时需要设计高效的中介者对象,避免其成为系统的瓶颈。
  3. 中介者模式可能会导致系统变得过于复杂,增加开发和维护的难度。在设计中介者模式时,需要权衡好各个对象之间的关系和交互方式,以及中介者对象的设计和实现方式,否则可能会导致系统变得过于复杂,增加开发和维护的难度。
  4. 中介者模式可能会导致系统扩展困难。在系统运行一段时间后,可能需要增加新的对象或修改原有对象的交互行为,此时需要修改中介者对象的实现方式。如果中介者对象的设计不够灵活,可能会导致系统扩展困难,需要对中介者对象进行大量的修改,甚至重新设计。
  5. 中介者模式可能会隐藏系统的交互细节,降低了系统的透明度。由于中介者对象统一管理对象间的交互行为,可能会隐藏各个对象之间的具体交互细节,降低了系统的透明度。此时需要通过合理的接口设计和文档说明来提高系统的透明度,方便系统的使用和维护。

总的来说,中介者模式适用于对象之间的交互比较复杂、耦合度较高的情况,可以有效地降低对象间的耦合度,提高系统的灵活性和可维护性。但是,在设计中介者模式时需要权衡好各个对象之间的关系和交互方式,以及中介者对象的设计和实现方式,避免引入不必要的复杂度和性能瓶颈。

4、使用场景

中介者模式适用于以下情况:

  1. 对象间的交互比较复杂,存在大量的相互关联和相互依赖,导致对象间的耦合度较高。
  2. 每个对象需要了解其他对象的状态信息,以便在某些情况下进行相应的处理,但这种相互依赖关系使得对象之间的通信比较困难。
  3. 对象间的交互方式和时机经常变化,难以通过继承和重写的方式进行管理和维护。
  4. 系统中存在大量的对象,它们之间的交互方式和时机比较复杂,难以通过简单的方法调用和事件通知来管理和维护。

在这些情况下,使用中介者模式可以有效地降低对象间的耦合度,提高系统的灵活性和可维护性。具体的使用场景包括:

  1. 图形界面应用程序中,各个控件之间的交互很复杂,需要通过中介者来统一管理。
  2. 聊天室等网络应用程序中,用户之间的交互非常频繁,需要通过中介者来管理。
  3. 多人协作编辑系统中,多个用户同时编辑同一文档,需要通过中介者来管理。
  4. 调停系统,如劳资调停、纠纷调停等,需要通过中介者来协调不同的利益关系。
  5. 游戏中,多个角色之间的交互非常复杂,需要通过中介者来管理。

总之,中介者模式适用于对象间的交互比较复杂、耦合度较高的情况,可以有效地降低对象间的耦合度,提高系统的灵活性和可维护性。在实际应用中,需要根据具体的业务需求和系统设计来决定是否采用中介者模式。

5、代码实现

下面我们用 Java 代码实现一个简单的中介者模式示例,以便更好地理解该模式的具体实现方式。

假设我们要实现一个简单的图形界面应用程序,其中包含多个控件,例如按钮、文本框、标签等。这些控件之间存在复杂的交互关系,例如点击按钮可以修改文本框中的文本内容,或者根据文本框中的文本内容来更新标签的显示内容等。为了管理这些控件之间的交互关系,我们使用中介者模式来实现。

首先,我们定义一个中介者接口 Mediator,它包含一个 notify 方法,用于通知中介者有控件的状态发生了变化:

public interface Mediator {
    void notify(Component component, String event);
}
           

其中,component 参数表示发生变化的控件对象,event 参数表示变化的类型。

然后,我们定义一个抽象控件类 Component,它包含一个中介者对象,并提供一个 changed 方法,用于通知中介者控件的状态发生了变化:

public abstract class Component {
    protected Mediator mediator;

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    public void changed(String event) {
        mediator.notify(this, event);
    }
}
           

其中,setMediator 方法用于设置中介者对象,changed 方法用于通知中介者控件的状态发生了变化。

接下来,我们定义具体控件类,例如 Button、TextBox、Label 等,它们继承自抽象控件类 Component,并实现自己的业务逻辑。例如,我们可以定义一个 Button 类,它在被点击时会通知中介者更新文本框中的文本内容:

public class Button extends Component {
    @Override
    public void changed(String event) {
        mediator.notify(this, event);
    }

    public void click() {
        changed("click");
    }
}
           

其中,click 方法表示按钮被点击时的行为,它会调用 changed 方法通知中介者按钮的状态发生了变化。

最后,我们定义一个具体中介者类 ConcreteMediator,它实现了中介者接口,负责控制各个控件之间的交互关系。例如,我们可以定义一个 ConcreteMediator 类,它负责监听按钮的点击事件,并根据按钮的状态更新文本框和标签的显示内容:

public class ConcreteMediator implements Mediator {
    private Button button;
    private TextBox textBox;
    private Label label;

    public void setButton(Button button) {
        this.button = button;
    }

    public void setTextBox(TextBox textBox) {
        this.textBox = textBox;
    }

    public void setLabel(Label label) {
        this.label = label;
    }

    @Override
    public void notify(Component component, String event) {
        if (component == button && event.equals("click")) {
            String text = textBox.getText();
            label.setText("Hello " + text + "!");
        } else if (component == textBox && event.equals("change")) {
            String text = textBox.getText();
            label.setText("Hello " + text + "!");
        }
    }
}
           

在 ConcreteMediator 类中,我们通过判断事件类型来实现控件之间的交互逻辑。例如,如果按钮被点击了,我们可以根据文本框中的文本内容更新标签的显示内容

在 ConcreteMediator 类中,我们通过判断事件类型来实现控件之间的交互逻辑。例如,如果按钮被点击了,我们可以根据文本框中的文本内容更新标签的显示内容

public class Main {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        Button button = new Button();
        TextBox textBox = new TextBox();
        Label label = new Label();

        mediator.setButton(button);
        mediator.setTextBox(textBox);
        mediator.setLabel(label);

        button.setMediator(mediator);
        textBox.setMediator(mediator);
        label.setMediator(mediator);

        button.click();
        textBox.setText("World");
    }
}
           

运行上述代码,可以看到控制台输出了以下结果:

        Hello !

        Hello World!

这表明按钮被点击时,中介者更新了标签的显示内容;当文本框的内容发生变化时,中介者也更新了标签的显示内容。

总之,中介者模式是一种有效的设计模式,它可以帮助我们更好地管理多个对象之间的交互关系,从而提高代码的可维护性和可扩展性。