中介模式的定义
在很多应用中,不同模块或者组件间的交互复杂且分散,这就难以管理和维护。在这种情况下,我们可以使用中介模式。在中介模式中,我们引入一个中介者对象,这个中介者就像是一个控制塔,负责处理其他对象间的通信。这样,所有的交互都被封装在中介者内部,而其他对象就无需互相知道,实现了解耦。
例子:一小时代办与通讯
让我用一个有趣的例子解释中介模式。想象一下,你正打算计划一场派对,你需要购买蛋糕,买一些饮料,然后还要订一家餐厅。 如果独自处理,你可能需要与三个完全独立的实体进行交涉。
现在,比如说有一个一小时代办服务,你只需要与其沟通,告诉他你所有的要求,然后他就会帮你搞定一切。如果你需要更改你的派对计划,你唯一需要做的只是打一通电话给这个一小时代办服务,其余的就让他来处理。
在编程中,“中介者” 就像是那个一小时代办服务, "组件"就像是买蛋糕的糕点店、提供饮料的供应商以及餐厅。
// 中介者接口 interface Mediator { public void makeTransaction(Component component, String message); } // 具体中介者 class PartyPlanner implements Mediator { @Override public void makeTransaction(Component component, String message) { // Handle communication between components } } // 具体组件 class Bakery extends Component { public Bakery(Mediator mediator){ super(mediator); } // Other methods } class DrinkSupplier extends Component { public DrinkSupplier(Mediator mediator){ super(mediator); } // Other methods }
上面的代码示例中,PartyPlanner
就是我们的 “代办服务”,它作为中介者,负责处理 Bakery
和 DrinkSupplier
之间的通信。
中介模式的好处
中介模式主要有以下这些好处:
- 降低耦合度:中介模式可以使各个同事类之间的交互被独立的封装到中介者对象中,使之各个同事类无需直接交互,降低了系统的耦合度,同时中介者将各同事类分散的交互行为集中管理和控制。
- 提高重用性:在中介者模式中,同事类主要用来实现一些业务功能,由于它与其他同事类的交互都委托给了中介者,因此各个同事类是松散的、可复用的技术构件,它们和其他同事类或中介者之间不存在直接的依赖关系,是满足“开闭原则”的典型模式。
- 更易于扩展和维护:由于中介者封装了系统交互,扩展系统只需添加新的中介者和新的同事类即可,相对来说比较容易。如果系统的某个同事类发生更改,只需要调整它与中介者的交互关系即可,其他的同事类可以不修改。
犹如我们之前提及的派对规划例子,通过中介模式,我们的"一小时代办服务"(中介者)帮我们处理所有复杂的交易,我们无需与蛋糕店、饮料供应商和餐厅直接交涉,使得我们只需要专注于与一小时代办服务的交互,从而使我们的时间和精力得以有效利用。
再者,如果我们想要添加新的组件,例如一家马戏团为我们的派对表演,我们只需要将其连接到中介者上,而无需影响到其他组件。
这正是中介模式的魔力所在。但切记,任何模式都不能滥用,合理地使用,它就能帮你解决许多不必要的麻烦,让代码的可维护性大大提升。