在面向对象的设计中,对象之间的交互是至关重要的,随着系统复杂度的增加,对象之间的直接交互可能会导致代码耦合度增加,从而降低系统的可维护性和扩展性,为了解决这个问题,中介者模式应运而生,本文将对中介者模式进行详细介绍,包括其定义、结构、应用场景以及优缺点等方面的内容。
1、中介者模式定义
中介者模式(Mediator Pattern)是一种行为型设计模式,它定义了一个对象(中介者)来封装一组对象之间的交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2、中介者模式结构
中介者模式包含以下几个角色:
- 抽象中介者(Mediator):定义了对象之间的交互接口,负责协调各个对象之间的交互。
- 具体中介者(ConcreteMediator):实现抽象中介者定义的接口,处理具体的交互逻辑。
- 抽象同事类(Colleague):定义了对象之间的交互方法,需要依赖于中介者来完成交互。
- 具体同事类(ConcreteColleague):实现抽象同事类定义的方法,完成具体的交互操作。
3、中介者模式应用场景
中介者模式适用于以下场景:
- 多个对象之间存在复杂的交互关系,直接交互会导致代码耦合度增加。
- 一个对象的状态发生改变时,需要通知其他多个对象。
- 一个对象需要同时与多个对象保持同步。
4、中介者模式优缺点
优点:
- 降低了对象之间的耦合度,提高了系统的可维护性和扩展性。
- 简化了对象之间的交互,使得对象之间的交互更加清晰。
- 符合开闭原则,当需要增加新的交互逻辑时,只需要扩展具体中介者类,而不需要修改原有对象。
缺点:
- 中介者模式增加了系统的复杂性,因为需要引入一个中介者对象来管理对象之间的交互。
- 如果中介者对象过多,可能会导致系统更加复杂,难以维护。
5、中介者模式实例
下面我们通过一个简单的例子来演示中介者模式的使用,假设有一个聊天室,里面有多个用户(同事类)可以进行聊天(交互),我们使用中介者模式来实现用户之间的聊天功能。
我们定义一个抽象同事类ChatRoomMember
,表示聊天室的用户:
public abstract class ChatRoomMember { protected Mediator mediator; public ChatRoomMember(Mediator mediator) { this.mediator = mediator; } public abstract void sendMessage(String message); }
我们定义一个具体同事类User
,表示聊天室的用户:
public class User extends ChatRoomMember { private String name; public User(String name, Mediator mediator) { super(mediator); this.name = name; } @Override public void sendMessage(String message) { System.out.println("User " + name + ": " + message); } }
我们定义一个抽象中介者类ChatRoom
,表示聊天室:
import java.util.ArrayList; import java.util.List; public abstract class ChatRoom { protected List<ChatRoomMember> members = new ArrayList<>(); public void addMember(ChatRoomMember member) { members.add(member); } public abstract void sendMessage(String message); }
我们定义一个具体中介者类ConcreteChatRoom
,实现聊天室的具体功能:
public class ConcreteChatRoom extends ChatRoom { @Override public void sendMessage(String message) { for (ChatRoomMember member : members) { member.sendMessage(message); } } }
我们在主程序中创建聊天室和用户,并实现用户之间的聊天功能:
public class Main { public static void main(String[] args) { ChatRoom chatRoom = new ConcreteChatRoom(); User user1 = new User("Alice", chatRoom); User user2 = new User("Bob", chatRoom); User user3 = new User("Charlie", chatRoom); chatRoom.addMember(user1); chatRoom.addMember(user2); chatRoom.addMember(user3); user1.sendMessage("Hello, everyone!"); user2.sendMessage("Hi, Alice!"); user3.sendMessage("Hey, Bob and Charlie!"); } }
运行结果:
User Alice: Hello, everyone! User Bob: Hi, Alice! User Charlie: Hey, Bob and Charlie!
通过以上示例,我们可以看到中介者模式成功地实现了用户之间的解耦和通信,当需要增加新的交互逻辑时,只需要扩展具体中介者类,而不需要修改原有对象,符合开闭原则。