中介者模式优势

Mediator Pattern Advantage

我正在阅读 GoF 的书。能否请您解释以下优点:

它限制子类化。调解员将原本会发生的行为本地化 分布在多个对象中。改变这种行为需要 仅对 Mediator 进行子类化;同事类可以原样重复使用

这是否意味着我们应该将 Mediator 或 ConcreteMediator 子类化? 我们可以拥有多个继承自同一中介者的 ConcreteMediator 吗?

本书是1994年或以前写的,主要是C++的例子。因此,它大量使用继承,部分原因是 C++ 允许多重继承,部分原因是该语言没有 接口[=52​​=] 的单独概念(如 Java 或 C#)。

在本书的开头,它声明了一个目标:

Favor object composition over class inheritance.

书中隐含的理解是继承可能不是重用的最佳机制。

考虑为中介者模式给出的示例:字体对话框。如果没有 Mediator (FontDialogDirector),ListBox 将需要直接了解 EntryField 以便更新它的状态变化。

通用 ListBox 在许多情况下都应该有用,无论是否有协作 EntryField。因此,可重用的 ListBox class 无法知道任何 'colleagues',因为那样会使它不可重用。

因此,如果没有 Mediator,您需要子class ListBox 才能将其连接到 EntryField。在伪 C# 中,它可能看起来像这样:

public class FontList : ListBox
{
    public FontList(EntryField entryField)
    {
        EntryField = entryField;
    }

    public EntryField EntryField { get; }

    protected override void Changed()
    {
        EntryField.Text = this.Selection;
    }
}

这是中介者模式限制的一种非常特殊的子classing。

Is it meant that we should subclass the Mediator or the ConcreteMediator?

都没有。请注意,模式描述的 Implementation 小节指出:

Omitting the abstract Mediator class. There's no need to define an abstract Mediator class when colleagues work with only one mediator. The abstract coupling that the Mediator class provides lets colleagues work with different Mediator subclasses and vice versa.

Mediator class 充当同事的中心联络点。如果只有一个 Mediator,它可以是具体的。区别点在于传播变化的方式。在示例中,每个 Widget 将更改传播到其 DialogDirector,如下所示:

_director->WidgetChanged(this);

我们可以想象 Widget 应该是一个可重用的 class,所以我们希望将它与任何具体的 Mediator 分离。这里假设可能不止一个。

另一方面,如果您有一组专门的同事不可可重用,他们可以通过具体的调解器进行通信。如果在那种情况下不需要重用,则 Mediator 不必是抽象的 class.