1.定义
中介者模式将同类对象之间的交互封装起来,使得同类对象之间不需要互相作用,而是把这种调用的行为放在中介对象中去进行;好处是降低了对象之间的耦合,是一种行为类模式;为什么要使用中介者模式?一般来说,同事类之间的关系是复杂的,多个同事类之间相互关联,会呈现出一种网络结果,这种过度耦合的网络结构,不利于系统的复用。
下面举个例子来说明下
2.例子
现在有个简单的场景:两个人之间可以互相聊天,那么简单点,程序可以这么来写:
public class People {
private String name;
private People people;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void connect(People people) {
this.people = people;
}
public void talk(String msg) {
System.out.println(this.getName() + "对" + this.people.getName() + "说:" + msg);
}
public People(String name) {
this.name = name;
}
public static void main(String[] args) {
People people1 = new People("张三");
People people2 = new People("李四");
people1.connect(people2);
people2.connect(people1);
people1.talk("尼好,很高兴认识你");
people2.talk("我也是哦");
}
}
每个people对象持有要聊天对象的一个引用;connect方法将建立起连接;运行结果如下
张三对李四说:尼好,很高兴认识你
李四对张三说:我也是哦
这里只是2个人之间,如果是很多个人之间聊天,那么就涉及到每个人都会持有其他人的引用,任何一个人的加入或者离开都要修改其他的人的持有用户的关系,所以可以考虑把这部分逻辑抽取出来,放在一个中介类里面ChatRoom,抽象出一个聊天室的中介类,任何用户的聊天行为都通过ChatRoom这个类来处理;具体代码如下
public class User {
private String name;
private ChatRoom chatRoom;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ChatRoom getChatRoom() {
return chatRoom;
}
public void setChatRoom(ChatRoom chatRoom) {
this.chatRoom = chatRoom;
}
public void login() {
this.chatRoom.addUser(this);
}
public void logout() {
this.chatRoom.removeUser(this);
}
public void sendMsg(String msg) {
this.chatRoom.talk(this, msg);
}
public void listen(User user, String msg) {
System.out.println(this.getName() + "收到一条消息:" + user.getName() + "说:" + msg);
}
}
User对象,user有登录和登出功能,登录的时候会调用聊天室的adduser添加用户,登出的时候调用聊天室的删除用户方法;用户还可以发送消息,然后还可以接受其他用户的消息;之后是聊天室ChatRoom类
public class ChatRoom {
private List<User> users = new ArrayList<>();
public void addUser(User user) {
this.users.add(user);
}
public void removeUser(User user) {
this.users.remove(user);
}
public void talk(User user, String msg) {
System.out.println(user.getName() + "发送了一条消息:" + msg);
this.users.stream().filter(t -> t.getName() != user.getName()).forEach(u -> u.listen(user, msg));
}
}
聊天室持有所有用户的一个列表,然后有添加和移除用户的功能,talk方法,用来向其他用户发送信息;测试代码如下所示
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoom();
User user1 = new User();
user1.setName("张三");
user1.setChatRoom(chatRoom);
user1.login();
User user2 = new User();
user2.setName("李四");
user2.setChatRoom(chatRoom);
user2.login();
User user3 = new User();
user3.setName("王五");
user3.setChatRoom(chatRoom);
user3.login();
user1.sendMsg("大家好,我是新来的");
}
运行结果如图所示
张三发送了一条消息:大家好,我是新来的
李四收到一条消息:张三说:大家好,我是新来的
王五收到一条消息:张三说:大家好,我是新来的
总结:当对象之间互相引用多的时候,考虑使用中介模式,降低对象之间的耦合;微服务中的注册中心其实也是使用中介模式,把服务的注册和寻址都放在注册中心上进行,而各个服务之间不需要关注其他服务的细节;