中介者模式的学习与使用

1、中介者模式的学习

  中介者模式是一种行为型设计模式,它通过引入一个中介者对象来解耦一组对象之间的交互。中介者模式促进了对象之间的松耦合,使得它们可以独立地进行通信,而不需要直接相互引用。
  在中介者模式中,有以下几个角色:

  • Mediator(中介者):定义了对象之间的通信接口,提供了注册、转发和通知等方法,可以协调不同对象之间的交互。
  • ConcreteMediator(具体中介者):实现了中介者接口,负责协调具体的对象之间的交互。它通常会维护一个对象的集合,用于管理对象之间的通信。
  • Colleague(同事):定义了对象之间的通信接口,通常包含一个send()方法用于发送消息,以及一个receive()方法用于接收消息。
  • ConcreteColleague(具体同事):实现了同事接口,负责向中介者发送和接收消息。

  中介者模式的核心思想是将对象之间的交互逻辑集中在中介者中,而不是让每个对象都直接与其他对象通信。当一个对象需要与其他对象进行通信时,它只需要通过中介者发送消息,而无需知道具体的目标对象。中介者负责将消息转发给合适的目标对象。
在这里插入图片描述

2、中介者模式的使用

  假设有一个聊天室程序,其中包含多个用户(User)和一个中介者(Mediator)。用户可以发送消息给其他用户,并接收其他用户发送的消息。中介者负责将用户发送的消息广播给所有其他用户。
抽象中介者

public interface Mediator {

    /**
     * 消息广播
     *
     * @param user
     * @param message
     */
    void messageBroadCasting(User user, String message);
}

具体中介者

public class MediatorImpl implements Mediator {

    private List<User> userList = Lists.newArrayList();

    public void registerUser(User user) {
        userList.add(user);
    }

    @Override
    public void messageBroadCasting(User user, String message) {
        userList.stream().filter(x -> x != user).forEach(m -> m.receiveMessage(message));
    }
}

抽象同事

public interface User {

    /**
     * 发送消息
     *
     * @param message
     */
    void sendMessage(String message);

    /**
     * 接收消息
     *
     * @param message
     */
    void receiveMessage(String message);
}

具体同事

public class FirstUserImpl implements User {

    private Mediator mediator;

    public FirstUserImpl(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void sendMessage(String message) {
        mediator.messageBroadCasting(this, message);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println(this.getClass().getSimpleName() + "接收到:" + message);
    }
}
public class SecondUserImpl implements User {

    private Mediator mediator;

    public SecondUserImpl(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void sendMessage(String message) {
        mediator.messageBroadCasting(this, message);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println(this.getClass().getSimpleName() + "接收到:" + message);
    }
}
public class ThirdUserImpl implements User {
    private Mediator mediator;

    public ThirdUserImpl(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void sendMessage(String message) {
        mediator.messageBroadCasting(this, message);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println(this.getClass().getSimpleName() + "接收到:" + message);
    }
}

客户端

public class UserClient {

    public static void main(String[] args) {
        MediatorImpl mediator = new MediatorImpl();

        User firstUser = new FirstUserImpl(mediator);
        mediator.registerUser(firstUser);

        User secondUser = new SecondUserImpl(mediator);
        mediator.registerUser(secondUser);

        User thirdUser = new ThirdUserImpl(mediator);
        mediator.registerUser(thirdUser);

        firstUser.sendMessage("我是第一个用户,这是我发的消息");
        secondUser.sendMessage("我是第二个用户,我收到了一条新消息");
        thirdUser.sendMessage("我是第三个用户,我收到了一条新消息");
    }

}
SecondUserImpl接收到:我是第一个用户,这是我发的消息
ThirdUserImpl接收到:我是第一个用户,这是我发的消息
FirstUserImpl接收到:我是第二个用户,我收到了一条新消息
ThirdUserImpl接收到:我是第二个用户,我收到了一条新消息
FirstUserImpl接收到:我是第三个用户,我收到了一条新消息
SecondUserImpl接收到:我是第三个用户,我收到了一条新消息

3、总结

  中介者模式的优点包括:

  • 解耦了对象之间的交互关系,使得对象之间的通信更加灵活和可扩展。
  • 降低了对象之间的复杂性,每个对象只需要关注自身的业务逻辑。
  • 可以简化对象的维护和调试,由于对象之间的交互逻辑集中在中介者中,可以更方便地追踪和调试问题。

然而,中介者模式也有一些限制和注意事项:

  • 中介者对象会变得复杂,因为它需要管理多个对象之间的交互。
  • 过度使用中介者模式可能会导致系统的复杂性增加,使得代码难以理解和维护。
  • 中介者模式的实现可能会导致性能问题,特别是当对象之间的交互非常频繁时。

总体而言,中介者模式适用于一组对象之间存在复杂的交互关系,或者对象之间的耦合度过高的情况。通过引入中介者对象,可以将对象之间的通信逻辑抽离出来,提高系统的灵活性和可维护性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值