一,介绍
中介者模式(Mediator Pattern)是一种行为设计模式,它定义了一个中介者对象来封装一系列对象之间的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,可以独立地改变它们之间的交互。
二,适用场景
- 系统中对象之间存在复杂的引用关系,导致依赖关系结构混乱且难以复用。
- 想通过一个中介者对象来控制多个对象之间的交互,简化对象之间的通信。
三,结构
中介者模式包含以下几个角色:
- Mediator(中介者):定义了同事对象到中介者对象的接口。
- ConcreteMediator(具体中介者):实现中介者接口,协调各同事对象之间的交互。
- Colleague(同事类):每一个同事类都知道它的中介者对象,并且在需要与其他同事交互时,与中介者通信。
uml类图:
四,示例代码
下面是一个简单的中介者模式示例,展示了如何使用中介者模式来协调多个对象之间的通信。
定义中介者接口:
public interface Mediator {
void sendMessage(String message, Colleague colleague);
void addColleague(Colleague colleague);
}
实现具体中介者:
import java.util.ArrayList;
import java.util.List;
public class ConcreteMediator implements Mediator {
private List<Colleague> colleagues;
public ConcreteMediator() {
this.colleagues = new ArrayList<>();
}
@Override
public void sendMessage(String message, Colleague colleague) {
for (Colleague c : colleagues) {
// 消息不会发送给发送消息的同事
if (c != colleague) {
c.receiveMessage(message);
}
}
}
@Override
public void addColleague(Colleague colleague) {
colleagues.add(colleague);
}
}
定义同事类:
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void sendMessage(String message);
public abstract void receiveMessage(String message);
}
实现具体同事类:
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
@Override
public void sendMessage(String message) {
System.out.println("ColleagueA sends message: " + message);
mediator.sendMessage(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("ColleagueA receives message: " + message);
}
}
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
@Override
public void sendMessage(String message) {
System.out.println("ColleagueB sends message: " + message);
mediator.sendMessage(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("ColleagueB receives message: " + message);
}
}
客户端代码:
public class Client {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
Colleague colleagueA = new ConcreteColleagueA(mediator);
Colleague colleagueB = new ConcreteColleagueB(mediator);
mediator.addColleague(colleagueA);
mediator.addColleague(colleagueB);
colleagueA.sendMessage("Hello from A!");
colleagueB.sendMessage("Hello from B!");
}
}
五,总结
中介者模式通过引入一个中介者对象来封装对象之间的交互,从而降低对象之间的耦合性,使系统更容易维护和扩展。在实际应用中,中介者模式常用于 GUI 应用程序中,以协调各组件之间的交互。
如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。
扫描下方二维码,立即关注我们吧!
感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!