中介者模式是一种对象设计模式,它通过引入一个中介者来封装一组对象的交互。这种模式可以有效地减少对象之间的依赖关系,提高系统的灵活性和可扩展性。而外观模式则是一种结构型设计模式,它为子系统中的一组接口提供一个统一的接口,这个接口使得这一子系统更加容易使用。这两种模式的主要区别在于中介者模式关注的是对象间的解耦和通信,而外观模式关注的是简化子系统的接口。
在面向对象编程中,设计模式是一种解决特定问题的可复用解决方案,中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介对象来封装一组对象的交互,从而减少对象之间的直接依赖关系,提高系统的灵活性和可扩展性,本文将详细介绍中介者模式的原理、应用场景以及如何实现中介者模式。
1、中介者模式原理
中介者模式的核心思想是通过引入一个中介对象来封装一组对象的交互,使得这些对象之间的通信变得更加清晰、简单,中介者模式的主要组成部分包括:
- 抽象中介者(Mediator):定义了一组对象共享的接口,用于封装对象之间的交互逻辑。
- 具体中介者(ConcreteMediator):实现抽象中介者定义的接口,负责协调各个对象之间的交互。
- 抽象同事类(Colleague):定义了一组对象的行为,每个对象都知道如何与其他对象进行交互。
- 具体同事类(ConcreteColleague):实现抽象同事类定义的行为,知道如何与其他对象进行交互。
2、中介者模式应用场景
中介者模式适用于以下场景:
- 多个对象之间存在复杂的交互关系,且需要频繁地相互通信。
- 对象之间的交互逻辑可能会随着需求的变化而变化,中介者模式可以有效地应对这种变化。
- 为了避免对象之间的直接依赖关系,提高系统的灵活性和可扩展性。
3、如何实现中介者模式
下面是一个简单的中介者模式实现示例:
我们定义一个抽象中介者(Mediator)类,该类包含一个同事列表(colleagues),用于存储所有同事对象,定义一个用于发送消息的方法(sendMessage),该方法接收两个参数:消息(message)和接收消息的同事(receiver)。
public abstract class Mediator { protected List<Colleague> colleagues = new ArrayList<>(); public abstract void sendMessage(String message, Colleague receiver); }
我们定义一个具体中介者(ConcreteMediator)类,继承自抽象中介者类,并实现发送消息的方法,在这个方法中,我们遍历同事列表,找到接收消息的同事,并调用其处理消息的方法(processMessage)。
public class ConcreteMediator extends Mediator { @Override public void sendMessage(String message, Colleague receiver) { for (Colleague colleague : colleagues) { if (colleague == receiver) { colleague.processMessage(message); break; } } } }
我们定义一个抽象同事类(Colleague),该类包含一个中介者引用(mediator),用于存储与该同事对象相关联的中介者对象,定义一个处理消息的方法(processMessage),该方法接收一个参数:消息(message)。
public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; mediator.colleagues.add(this); } public abstract void processMessage(String message); }
我们定义两个具体同事类(ConcreteColleague),分别继承自抽象同事类,这两个具体同事类分别实现了处理消息的方法,当接收到消息时,会执行相应的操作。
public class ConcreteColleagueA extends Colleague { public ConcreteColleagueA(Mediator mediator) { super(mediator); } @Override public void processMessage(String message) { System.out.println("ConcreteColleagueA received message: " + message); } } public class ConcreteColleagueB extends Colleague { public ConcreteColleagueB(Mediator mediator) { super(mediator); } @Override public void processMessage(String message) { System.out.println("ConcreteColleagueB received message: " + message); } }
至此,我们已经实现了一个简单的中介者模式,当我们需要发送消息时,只需创建一个具体中介者对象,然后通过该对象调用发送消息的方法即可。
public class Main { public static void main(String[] args) { Mediator mediator = new ConcreteMediator(); Colleague colleagueA = new ConcreteColleagueA(mediator); Colleague colleagueB = new ConcreteColleagueB(mediator); mediator.sendMessage("Hello", colleagueA); mediator.sendMessage("Hi", colleagueB); } }
运行上述代码,可以看到如下输出:
ConcreteColleagueA received message: Hello ConcreteColleagueB received message: Hi
通过使用中介者模式,我们成功地实现了对象间的解耦与通信,提高了系统的灵活性和可扩展性,中介者模式并不是适用于所有场景的解决方案,我们需要根据实际需求来判断是否采用中介者模式。