中介者模式是一种对象间通信的优雅解决方案,它通过引入一个中介者对象来封装一系列对象的交互。而外观模式则是一种简化复杂子系统的访问接口的方式,通过为子系统中的一组接口提供一个统一的接口。两者的主要区别在于中介者模式关注的是对象间的通信和解耦,而外观模式关注的是简化子系统的访问。
在软件开发中,对象间的通信是一个常见的需求,为了实现对象间的解耦和降低系统的复杂性,我们需要采用一种设计模式来管理对象间的交互,中介者模式(Mediator Pattern)就是这样一种设计模式,它通过引入一个中介者对象来封装对象间的交互,使得对象之间的耦合度降低,提高系统的可维护性和扩展性。
中介者模式的定义如下:
中介者模式是一种行为设计模式,它通过引入一个中介者对象来封装一组对象之间的交互,这样,对象之间的交互不再直接进行,而是通过中介者对象来实现,当对象之间的交互变得复杂时,中介者模式可以有效地简化对象之间的依赖关系,降低系统的复杂性。
中介者模式的主要角色有以下三个:
1、抽象中介者(Mediator):定义了对象之间的交互接口,封装了对象之间的交互逻辑,具体中介者类需要实现这个接口。
2、具体中介者(ConcreteMediator):实现了抽象中介者接口,负责管理对象之间的交互,具体中介者类通常是一个单例,因为它需要在整个系统中保持对对象的引用。
3、抽象同事类(Colleague):定义了对象之间的交互方法,每个对象都需要实现这个接口,具体同事类需要知道中介者对象,以便在需要的时候与中介者进行交互。
中介者模式的实现步骤如下:
1、定义抽象中介者接口(Mediator),定义对象之间的交互接口。
2、定义具体中介者类(ConcreteMediator),实现抽象中介者接口,负责管理对象之间的交互。
3、定义抽象同事类(Colleague),定义对象之间的交互方法。
4、定义具体同事类(ConcreteColleague),实现抽象同事类,需要知道中介者对象,以便在需要的时候与中介者进行交互。
5、客户端代码创建具体同事对象和中介者对象,然后通过中介者对象进行对象间的交互。
下面是一个使用中介者模式的Java示例:
// 抽象中介者接口 interface Mediator { void send(String message, Colleague colleague); } // 具体中介者类 class ConcreteMediator implements Mediator { private List<Colleague> colleagues = new ArrayList<>(); public void addColleague(Colleague colleague) { colleagues.add(colleague); } public void removeColleague(Colleague colleague) { colleagues.remove(colleague); } @Override public void send(String message, Colleague colleague) { for (Colleague c : colleagues) { if (c != colleague) { c.receive(message); } } } } // 抽象同事类 interface Colleague { void receive(String message); } // 具体同事类A class ConcreteColleagueA implements Colleague { private Mediator mediator; public ConcreteColleagueA(Mediator mediator) { this.mediator = mediator; mediator.addColleague(this); } @Override public void receive(String message) { System.out.println("同事A收到消息:" + message); } public void sendMessage(String message) { mediator.send(message, this); } } // 具体同事类B class ConcreteColleagueB implements Colleague { private Mediator mediator; public ConcreteColleagueB(Mediator mediator) { this.mediator = mediator; mediator.addColleague(this); } @Override public void receive(String message) { System.out.println("同事B收到消息:" + message); } public void sendMessage(String message) { mediator.send(message, this); } } // 客户端代码 public class Client { public static void main(String[] args) { Mediator mediator = new ConcreteMediator(); Colleague colleagueA = new ConcreteColleagueA(mediator); Colleague colleagueB = new ConcreteColleagueB(mediator); colleagueA.sendMessage("Hello"); colleagueB.sendMessage("Hi"); } }
通过中介者模式,我们成功地将对象A和对象B之间的交互解耦,降低了系统的复杂性,当需要添加更多的同事对象时,只需要实现抽象同事类,并在具体同事类的构造函数中将中介者对象传递给它即可,这样,我们可以很容易地扩展系统,而不需要修改现有代码。