设计模式-中介者模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397)

定义

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

特点

集中相关对象之间复杂的沟通和控制方式。

使用场景

    • 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
    • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。

优缺点

(1) 优点
    • 降低了类的复杂度,将一对多转化成了一对一。
    • 各个类之间的解耦。
(2) 缺点
    • 中介者会庞大,变得复杂难以维护。

模式结构

    • 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
    • 具体中介者(ChatPlatform)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
    • 抽象同事类(User)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
    • 具体同事类(NormalUser)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

具体实现

中介者

/**
 * 抽象中介者
 */
public abstract class Mediator {
    //所有在聊天室里的人存这
    List<User> userList = new ArrayList<>();

    /**
     * 群发
     */
    abstract void sendToAll(String msg);

    /**
     * 给某个人发送消息
     */
    abstract void senToPerson(String msg, String name);

    /**
     * 用户加入聊天室
     */
    abstract void join(User user);

    /**
     * 用户离开聊天室
     */
    abstract void leave(User user);
}

/**
 * 具体中介者实现--聊天室平台
 */
public class ChatPlatform extends Mediator {
    @Override
    void sendToAll(String msg) {
        for (User u : userList) {
            u.accept(msg);
        }
    }

    @Override
    void senToPerson(String msg, String name) {
        for (User u : userList) {
            if (u.name.equals(name))
                u.accept(msg);
        }
    }

    @Override
    void join(User user) {
        userList.add(user);
    }

    @Override
    void leave(User user) {
        userList.remove(user);
    }
}

同事类

/**
 * 抽象同事
 */
public abstract class User {

    protected Mediator mediator;
    String name;
    //在创建对象的时候就把他的中间者传入,他要发送都是通过这个中介者来做的。
    public User(String name, Mediator mediator){
        this.name = name;
        this.mediator = mediator;
    }

    /**
     * 给所有人发消息
     */
    abstract void sendToAll(String msg);

    /**
     * 给某个人发送消息
     */
    abstract void senToPerson(String msg, String name);

    /**
     * 接收消息
     */
    abstract void accept(String msg);

    /**
     * 加入聊天室
     */
    abstract void join();

    /**
     * 离开聊天室
     */
    abstract void leave();
}

/**
 * 具体同事
 */
public class NormalUser extends User {
    public NormalUser(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    void sendToAll(String msg) {
        mediator.sendToAll(msg);
    }

    @Override
    void senToPerson(String msg, String name) {
        mediator.senToPerson(msg, name);
    }

    @Override
    void accept(String msg) {
        System.out.println(this.name + "收到消息:" + msg);
    }

    @Override
    void join() {
        mediator.join(this);
    }

    @Override
    void leave() {
        mediator.leave(this);
    }
}

具体使用

/**
 * 中介者模式测试类
 */
public class App {
    public static void main(String[] args) {
        Mediator chatPlatform = new ChatPlatform();
        User a = new NormalUser("A", chatPlatform);
        User b = new NormalUser("B", chatPlatform);
        User c = new NormalUser("C", chatPlatform);
        a.join();
        b.join();
        c.join();

        System.out.println("-----------------A群发送消息------------------");
        a.sendToAll("A:大家听得到吗?");

        System.out.println("-----------------A给B私发消息------------------");
        a.senToPerson("A:B,我只想和你说", "B");

        System.out.println("-----------------B给A私发消息------------------");
        b.senToPerson("B:可以,请说", "A");

        System.out.println("-----------------A离开聊天室------------------");
        a.leave();

        System.out.println("-----------------B群发送消息------------------");
        b.sendToAll("B:A能听到吗");
    }
}

实际应用

  1. MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
  2. 任务调度器
    • All scheduleXXX() methods of java.util.Timer
    • java.util.concurrent.Executor#execute()
    • submit() and invokeXXX() methods of java.util.concurrent.ExecutorService
    • scheduleXXX() methods of java.util.concurrent.ScheduledExecutorService

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值