设计模式之中介者模式

171 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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");
    }
}

最终的结果是消息成功地发送出去了,并被李四收到。

总结

中介者最大的优点是解耦,避免了业务的交叉与耦合,使代码的实现思路更见简介,也方便后续拓展。缺点是引入了太多的类,维护稍显困难,适合在业务交互引用比较复杂的场景中使用。