一、中介者模式
1、中介者模式
中介者模式(Mediator Pattern)是一种行为型模式。主要通过一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。
2、实现思路
(1)、定义实体对象的规范行为接口。
(2)、编写实现类,需要内置中介类。需要通过中介接收数据。
(3)、定义中介类,包含实体类对象的集合。将接收到的信息传送给具体的实现对象。
二、代码示例
1、示例场景
用户聊天室,张三发送消息到聊天室,李四可以接收;李四发送消息到聊天室,张三可以接收。
2、代码示例
// 1、定义用户规范行为
public interface User {void sendMsg(String msg, String reveiveUser);void receiveMsg(String msg);String getName();
}
// 2、定义中介类,包含用户类的集合,包含消息的转发实现
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;public class ChatRoom {static List<User> userList = new ArrayList<>();public void addUser(User user) {this.userList.add(user);}public void removeUser(String userName) {if (!CollectionUtils.isEmpty(userList)) {for (User user : userList) {if (user.getName().equals(userName)) {this.userList.remove(user);}}}}public void sendMsg(User sender, String msg, String receiveName) {if (!CollectionUtils.isEmpty(userList)) {for (User user : userList) {if (user.getName().equals(receiveName)) {user.receiveMsg(sender.getName() + "发送消息:" + msg);}}}}
}// 3、定义用户的实现类
import lombok.Data;
@Data
public class ChatUser implements User {private String name;private ChatRoom chatRoom;public String getName() {return name;}public ChatUser(String name, ChatRoom chatRoom) {this.name = name;this.chatRoom = chatRoom;}@Overridepublic void sendMsg(String msg, String reveiveUser) {chatRoom.sendMsg(this, msg, reveiveUser);}@Overridepublic void receiveMsg(String msg) {System.out.println(msg);}
}
// 4、测试
public static void main(String[] args) {ChatRoom room = new ChatRoom();User user = new ChatUser("张三", room);User user1 = new ChatUser("李四", room);room.addUser(user);room.addUser(user1);Scanner scanner = new Scanner(System.in);int num = 0;while (true) {String msg = scanner.nextLine();if (num % 2 == 0) {user.sendMsg(msg, "李四");} else {user1.sendMsg(msg, "张三");}num++;}}
运行结果:
可以看到张三发送消息到聊天室,聊天室调用了李四的接收方法;李四发送消息到聊天室,聊天室调用了张三的接收方法。
总结:
中介者模式,顾名思义,就是通过中间人的介入完成不同业务之间的解耦行为。在生活中非常常见,放到代码中也很好理解。主要特点为实体对象和中介者产生关联,消费对象也和中介者产生关联。在代码实现上,一般多通过内置对象的形式,即对象实体内包含中介对象,中介对象内包含实体对象集合等,两者之间可以通过各自的方法去添加彼此。
学海无涯苦作舟!!!