一.中介者模式介绍与使用场景
中介者模式(Mediator Pattern)是一种行为设计模式,它通过封装一系列对象之间的交互,将对象之间的通信集中处理,从而降低对象之间的耦合度。
中介者模式的核心是中介者(Mediator)角色,它定义了对象之间的通信接口,负责协调和控制对象之间的交互。具体的对象称为同事(Colleague)角色,每个同事角色都与中介者进行通信,而不直接与其他同事进行交互。
中介者模式的应用场景:
1.当系统中的对象之间存在复杂的相互关系和依赖关系,导致对象之间的通信和协作变得混乱难以维护时,可以考虑使用中介者模式。中介者模式将对象之间的通信集中在一个中介者对象中,简化了对象之间的交互,减少了耦合度。
2.当系统中的对象之间需要进行频繁的通信和协作,而且每个对象都需要知道其他对象的信息时,可以使用中介者模式。中介者模式可以避免对象之间相互引用,降低了对象之间的直接依赖关系,提高了系统的灵活性和可维护性。
3.当系统中的对象之间存在复杂的交互逻辑和业务流程,而且这些逻辑分散在多个对象中时,可以使用中介者模式。中介者模式可以将复杂的交互逻辑封装在中介者中,使得对象之间的交互更加简洁和可控。
4.当系统中的某个对象的行为依赖于其他多个对象的状态变化时,可以使用中介者模式。中介者可以监控对象的状态变化,并根据需要进行协调和调度,确保对象之间的一致性和正确性。
5.当系统需要扩展新的对象或者修改现有对象时,可以考虑使用中介者模式。中介者模式可以减少新对象和现有对象之间的直接依赖关系,降低修改的复杂性,提高系统的可扩展性。
需要注意的是,中介者模式在一定程度上引入了中介者对象作为中心化的调度者,可能会增加系统的复杂性。因此,需要根据具体的应用场景和需求来判断是否使用中介者模式。
二.中介者模式实现
下面是一个使用Java实现的简单示例:
首先,我们定义中介者接口 Mediator
:
public interface Mediator { void send(String message, Colleague colleague); }
然后,我们创建具体中介者类 ConcreteMediator
,实现中介者接口,并管理同事对象之间的交互:
public class ConcreteMediator implements Mediator { private Colleague colleague1; private Colleague colleague2; public void setColleague1(Colleague colleague1) { this.colleague1 = colleague1; } public void setColleague2(Colleague colleague2) { this.colleague2 = colleague2; } public void send(String message, Colleague colleague) { if (colleague == colleague1) { colleague2.receive(message); } else if (colleague == colleague2) { colleague1.receive(message); } } }
接下来,我们创建同事接口 Colleague
:
public interface Colleague { void receive(String message); void send(String message); }
然后,我们创建具体同事类 ConcreteColleague
,实现同事接口,并在需要发送消息时通知中介者:
public class ConcreteColleague implements Colleague { private Mediator mediator; public ConcreteColleague(Mediator mediator) { this.mediator = mediator; } public void receive(String message) { System.out.println("Received: " + message); } public void send(String message) { mediator.send(message, this); } }
最后,我们可以在客户端中使用中介者模式:
public class Client { public static void main(String[] args) { ConcreteMediator mediator = new ConcreteMediator(); ConcreteColleague colleague1 = new ConcreteColleague(mediator); ConcreteColleague colleague2 = new ConcreteColleague(mediator); mediator.setColleague1(colleague1); mediator.setColleague2(colleague2); colleague1.send("Hello, colleague2!"); colleague2.send("Hi, colleague1!"); } }
在上面的示例中,我们创建了一个具体中介者对象 mediator,以及两个具体同事对象 colleague1 和 colleague2。然后,通过调用中介者的 setColleague1() 和 setColleague2() 方法将同事对象注册到中介者中。最后,同事对象可以通过调用自己的 send() 方法发送消息,中介者会负责将消息转发给其他同事。
下面再来举一个实际项目开发中的应用场景例子
假设我们正在开发一个聊天室系统,其中有多个用户同时在线,并且用户之间可以发送消息。我们希望使用中介者模式来管理用户之间的消息传递。
首先,我们定义中介者接口 ChatMediator:
public interface ChatMediator { void sendMessage(String message, User user); void addUser(User user); }
然后,我们创建具体中介者类 ChatRoom
,实现中介者接口,并管理用户对象之间的消息传递:
import java.util.ArrayList; import java.util.List; public class ChatRoom implements ChatMediator { private List<User> users; public ChatRoom() { users = new ArrayList<>(); } public void sendMessage(String message, User user) { for (User u : users) { if (u != user) { u.receiveMessage(message); } } } public void addUser(User user) { users.add(user); } }
接下来,我们创建用户类 User
,实现用户的行为和消息的接收:
public class User { private String name; private ChatMediator chatMediator; public User(String name, ChatMediator chatMediator) { this.name = name; this.chatMediator = chatMediator; } public void sendMessage(String message) { chatMediator.sendMessage(message, this); } public void receiveMessage(String message) { System.out.println(name + " received message: " + message); } }
最后,我们可以在客户端中使用中介者模式:
public class Client { public static void main(String[] args) { ChatMediator chatMediator = new ChatRoom(); User user1 = new User("User1", chatMediator); User user2 = new User("User2", chatMediator); User user3 = new User("User3", chatMediator); chatMediator.addUser(user1); chatMediator.addUser(user2); chatMediator.addUser(user3); user1.sendMessage("Hello, everyone!"); user2.sendMessage("Hi, User1!"); } }
在上面的示例中,我们创建了一个具体中介者对象 chatMediator,以及多个用户对象 user1、user2 和 user3。然后,通过调用中介者的 addUser() 方法将用户对象注册到中介者中。最后,用户对象可以通过调用自己的 sendMessage() 方法发送消息,中介者会负责将消息转发给其他用户。