如何解决中介模式优势
我正在阅读 GoF 的书。能否请您解释一下以下优势:
它限制了子类化。调解员将行为本地化,否则将 分布在多个对象中。改变这种行为需要 仅对 Mediator 进行子类化;同事类可以按原样重复使用。
这是否意味着我们应该继承 Mediator 或 ConcreteMediator? 我们可以有多个 ConcreteMediator 从同一个 Mediator 继承吗?
解决方法
这本书写于 1994 年或之前,主要是用 C++ 编写的例子。因此,它大量使用继承,部分是因为 C++ 允许多重继承,部分是因为该语言没有单独的接口概念(如 Java 或 C#)。
在本书的开头,它声明了一个目标:
更喜欢对象组合而不是类继承。
书中隐含的理解是继承可能不是重用的最佳机制。
考虑为 Mediator 模式给出的示例:字体对话框。如果没有中介 (FontDialogDirector
),ListBox
将需要直接了解 EntryField
以更新其状态更改。
通用 ListBox
在许多情况下都应该有用,无论是否有协作的 EntryField
。因此,一个可重用的 ListBox
类不能知道任何“同事”,因为这会使其不可重用。
因此,如果没有 Mediator,您需要子类化 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;
}
}
这是 Mediator 模式限制的一种非常特殊的子类化。
这意味着我们应该继承 Mediator 或 ConcreteMediator 吗?
都没有。请注意,模式描述的 Implementation 小节指出:
省略抽象中介类。当同事只使用一个中介时,不需要定义抽象中介类。 Mediator 类提供的抽象耦合让同事可以使用不同的 Mediator 子类,反之亦然。
Mediator
类充当同事的中心联系点。如果只有一个 Mediator,它可以是具体的。区别在于你如何传播变化。在该示例中,每个 Widget
将更改传播到其 DialogDirector
,如下所示:
_director->WidgetChanged(this);
我们可以想象 Widget
应该是一个可重用的类,因此我们希望将它与任何具体的 Mediator 解耦。这里的假设是可能不止一个。
另一方面,如果您有一组不可可重用的专门同事,他们可以通过具体的中介进行通信。如果在这种情况下不需要重用,则 Mediator 不必是抽象类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。