1、模式介绍:
中介者模式是一种行为设计模式,它允许对象之间通过一个中介对象进行协作,而不直接相互引用,从而降低了它们之间的耦合度。在中介者模式中,对象之间的交互被封装在一个中介对象中,对象不再直接交互,而是通过中介者进行通信。
2、应用场景:
当一组对象之间的通信方式复杂,并且每个对象都需要了解其他对象的状态时,可以使用中介者模式简化对象之间的交互。
当多个对象之间形成的网状结构导致难以维护时,可以引入中介者来集中控制和管理对象之间的交互。
3、优点:
降低了对象之间的耦合度,使得对象易于独立复用。
将多个对象之间的交互集中管理,减少了代码的复杂性。
可以简化对象之间的通信,使得系统更易于维护和扩展。
4、缺点:
中介者模式会导致中介者本身变得复杂且难以维护,特别是当逻辑复杂、对象之间关系多变时。
如果设计不当,中介者本身可能成为系统的瓶颈,影响系统的性能。
5、代码示例:
/**
* 中介者接口
*/
public interface Mediator {
void sendMessage(String message, Colleague colleague);
}
/**
* 同事类抽象接口
*/
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 ConcreteMediator implements Mediator {
private List<Colleague> colleagues = new ArrayList<>();
public void addColleague(Colleague colleague) {
colleagues.add(colleague);
}
@Override
public void sendMessage(String message, Colleague originator) {
// 中介者接收到消息后,转发给其他同事
for (Colleague colleague : colleagues) {
if (colleague != originator) {
colleague.receiveMessage(message);
}
}
}
}
/**
* 具体同事类
*/
public class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
@Override
public void sendMessage(String message) {
mediator.sendMessage(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("ConcreteColleague1 received: " + message);
}
}
/**
* 具体同事类
*/
public class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
@Override
public void sendMessage(String message) {
mediator.sendMessage(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("ConcreteColleague2 received: " + message);
}
}
/**
* 应用
*/
public class MediatorClient {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
mediator.addColleague(colleague1);
mediator.addColleague(colleague2);
colleague1.sendMessage("Hello from Colleague1");
colleague2.sendMessage("Hi from Colleague2");
}
}
6、示例讲解:
Mediator
定义了中介者的接口,包括发送消息的方法。ConcreteMediator
是具体的中介者实现,维护了一个同事列表,并实现了消息的转发逻辑。Colleague
是同事类的抽象,包含了一个中介者对象和发送、接收消息的抽象方法。ConcreteColleague1
和 ConcreteColleague2
是具体的同事类实现,它们通过中介者来发送和接收消息。
在 main
方法中,创建了中介者对象和多个同事对象,并演示了它们通过中介者进行消息交互的过程。