【设计模式】用Java实现中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,它通过封装一系列对象之间的交互,将对象之间的通信集中处理,从而降低对象之间的耦合度。中介者模式的核心是中介者(Mediator)角色,它定义了对象之间的通信接口,负责协调和控制对象之间的交互。具体的对象称为同事(Colleague)角色,每个同事角色都与中介者进行通信,而不直接与其他同事进行交互。当系统中的对象之间存在复杂的相互关系
一.中介者模式介绍与使用场景
中介者模式(Mediator Pattern)是一种行为设计模式,它通过封装一系列对象之间的交互,将对象之间的通信集中处理,从而降低对象之间的耦合度。
中介者模式的核心是中介者(Mediator)角色,它定义了对象之间的通信接口,负责协调和控制对象之间的交互。具体的对象称为同事(Colleague)角色,每个同事角色都与中介者进行通信,而不直接与其他同事进行交互。
中介者模式的应用场景:
当系统中的对象之间存在复杂的相互关系和依赖关系,导致对象之间的通信和协作变得混乱难以维护时,可以考虑使用中介者模式。中介者模式将对象之间的通信集中在一个中介者对象中,简化了对象之间的交互,减少了耦合度。
当系统中的对象之间需要进行频繁的通信和协作,而且每个对象都需要知道其他对象的信息时,可以使用中介者模式。中介者模式可以避免对象之间相互引用,降低了对象之间的直接依赖关系,提高了系统的灵活性和可维护性。
当系统中的对象之间存在复杂的交互逻辑和业务流程,而且这些逻辑分散在多个对象中时,可以使用中介者模式。中介者模式可以将复杂的交互逻辑封装在中介者中,使得对象之间的交互更加简洁和可控。
当系统中的某个对象的行为依赖于其他多个对象的状态变化时,可以使用中介者模式。中介者可以监控对象的状态变化,并根据需要进行协调和调度,确保对象之间的一致性和正确性。
当系统需要扩展新的对象或者修改现有对象时,可以考虑使用中介者模式。中介者模式可以减少新对象和现有对象之间的直接依赖关系,降低修改的复杂性,提高系统的可扩展性。
需要注意的是,中介者模式在一定程度上引入了中介者对象作为中心化的调度者,可能会增加系统的复杂性。因此,需要根据具体的应用场景和需求来判断是否使用中介者模式。
二.中介者模式实现
下面是一个使用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()
方法发送消息,中介者会负责将消息转发给其他用户。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)