携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
简介
中介者模式的定义是:
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
中介大家都再熟悉不过了,房产中介,工作中介,婚姻中介,简单理解中介就是一个中间人,他帮有需求的各方牵线搭桥,进行消息传递。引入中介我们虽然引入了第三个人但是大家专业的人做专业的事,中介者可以把各方做筛选,将你的消息和需求传递给正确的人。
案例
我们就以微信发现消息为例子来讲解中介者模式。那微信就是一个中介者,将用户的消息转发到正确的人那里。我们先定义一个抽象的中介者
public interface Chatter {
void transfer(String from, String to, String msg);
void add(IUser IUser);
}
作为一个中介者,它应该有的方法是能让人把信息给它,它需要维护所有人的信息,然后它又将这些信息发送给要发送的人。(所以中介卖的就是信息资源)
然后定义一个真实的中介者,即微信
public class WeChat implements Chatter {
private List<IUser> userList = new ArrayList();
public void add(IUser IUser) {
userList.add(IUser);
}
@Override
public void transfer(String from, String to, String msg) {
IUser IUser = userList.stream().filter(e -> Objects.equals(to, e.getName())).findFirst().get();
IUser.receive(from, msg);
}
}
实现用户的向它注册,然后转发用户的信息
然后定义一个抽象的用户
public abstract class IUser {
public IUser(String name) {
this.name = name;
}
private String name;
protected Chatter chatter;
public void setChatter(Chatter chatter) {
this.chatter = chatter;
}
public String getName() {
return name;
}
public abstract void login(Chatter chatter);
public abstract void send(String to, String msg);
public abstract void receive(String from, String msg);
}
用户有名字,然后又一个中介者,用户通过中介向外部发布信息,然后用户定义3个方法,分别向中介者注册,发送消息和接收消息
最后定义用户的实现
public class Friends extends IUser {
public Friends(String name) {
super(name);
}
@Override
public void login(Chatter chatter) {
chatter.add(this);
super.setChatter(chatter);
}
@Override
public void send(String to, String msg) {
this.chatter.transfer(this.getName(), to,msg);
}
@Override
public void receive(String from, String msg) {
System.out.println(from + ":" + msg);
}
}
最后咱们来测试下
public class App {
public static void main(String[] args) {
WeChat weChat = new WeChat();
Friends zhangsan = new Friends("zhangsan");
zhangsan.login(weChat);
Friends lisi = new Friends("lisi");
lisi.login(weChat);
zhangsan.send("lisi", "zhangsan to lisi");
}
}
最终的结果是消息成功地发送出去了,并被李四收到。
总结
中介者最大的优点是解耦,避免了业务的交叉与耦合,使代码的实现思路更见简介,也方便后续拓展。缺点是引入了太多的类,维护稍显困难,适合在业务交互引用比较复杂的场景中使用。