设计模式之中介者模式

1.中介者模式概念

定义了一个对象来封装一系列其他对象之间的交互,从而降低这些对象间的耦合度。这种模式使得各个对象不需要显式地相互引用,而是通过一个中介者对象来进行通信。

2.中介者模式组成

1)抽象中介者(Mediator)

抽象中介者是一个接口或抽象类,定义了中介者的基本行为。如注册,接受消息,转发消息

2)具体中介者(Concrete Mediator)

具体中介者实现了抽象中介者接口中的方法,协调各个同事对象之间的交互。

3)抽象同事类(Colleague)

抽象同事类是一个接口或抽象类,定义了同事对象的基本行为。如发送消息,接受消息

4)具体同事类(ConcreteColleague)

具体同事类实现了抽象同事类中的方法,负责具体的业务逻辑。

3.举个栗子

小久和惜己在外地一起工作,正好自己的朋友惜己要回到自己家乡办事,然后拜托惜己给父母捎点这里的土特产,父母收到土特产。

如下图

父母收到小久的土特产很高兴,拜托惜己给小久带了妈妈的毛衣,惜己办完事回去,小久收到妈妈亲手制作的毛衣。

4.代码实现

1)同事抽象类

java 复制代码
package org.xiji.mediator;

/**
 * 同事抽象类
 */
public interface Colleague {



    /**
     * 发送消息
     */

    void send(String msg, SendAndReceiveContain sendAndReceiveContain);
    /**
     * 接受消息
     */
    void receive(String msg, SendAndReceiveContain sendAndReceiveContain);
}

2)中介抽象类

java 复制代码
package org.xiji.mediator;

/**
 * 中介者接口
 */
public interface Mediator {

    /**
     * 注册
     */

    void register(User user);
    /**
     * 转发消息
     */
    void sendMessage(String msg, SendAndReceiveContain sendAndReceiveContain);
}

3)接受发送容器类

java 复制代码
package org.xiji.mediator;

/**
 * 接受者,发送者容器
 */
public class SendAndReceiveContain {
    /**
     * 接收者
     */
    public User receiver;
    /**
     *
     * 发送者
     */
    public User send;

    public SendAndReceiveContain(User receiver, User send) {
        this.receiver = receiver;
        this.send = send;
    }

}

4)同事抽象实现类

java 复制代码
package org.xiji.mediator;

public class User implements Colleague{
    String name;
    /**
     * 中介者
     */
    Mediator mediator;

    public User(Mediator mediator,String name)
    {
        this.mediator = mediator;
        this.name =name;
        mediator.register(this);
    }
    //注册信息


    /**
     * 发送消息
     */

    @Override
    public void send(String msg, SendAndReceiveContain sendAndReceiveContain) {
        System.out.println(this.name+"发送消息:" +msg+"to"+sendAndReceiveContain.receiver.name);

        mediator.sendMessage(msg,sendAndReceiveContain);

    }

    /**
     * 接受消息
     */
    @Override
    public void receive(String msg, SendAndReceiveContain sendAndReceiveContain) {
        System.out.println(this.name+"收到消息:" +msg+"\n发送者:"+sendAndReceiveContain.send.name);

    }






}

5)中介抽象实现类

java 复制代码
package org.xiji.mediator;

import java.util.ArrayList;
import java.util.List;

public class MediatorImpl implements Mediator{
    /**
     * 定义集合,用于存储所有的同事对象
     */
    List<User> users = new ArrayList<>();
    /**
     *添加用户
     */
    @Override
    public void register(User user) {
        users.add(user);
    }

    /**
     * 转发信息
     */
    @Override
    public void sendMessage(String msg, SendAndReceiveContain sendAndReceiveContain) {

        for (User user : users) {

                if (user.name.equals(sendAndReceiveContain.receiver.name)) {
                    //转发信息
                    System.out.println("惜己"+"把"+sendAndReceiveContain.send.name+msg+"带给"+sendAndReceiveContain.receiver.name);
                    user.receive(msg,sendAndReceiveContain);

                }



        }

    }
}

6)测试代码实现类

java 复制代码
package org.xiji.mediator;

import java.util.Scanner;

/**
 * 中介者模式测试类
 */
public class MediatorMain {

    public static void main(String[] args) {

        //中介者
        Mediator 惜己 = new MediatorImpl();

        //容器
        User 小久 = new User(惜己,"小久");


        //小久父母
        User 父母 = new User(惜己,"小久父母");

        //小久===》父母
        SendAndReceiveContain sendAndReceiveContain = new SendAndReceiveContain(父母, 小久);
        //父母===》小久
        SendAndReceiveContain sendAndReceiveContain1 = new SendAndReceiveContain(小久, 父母);


        Scanner scanner = new Scanner(System.in);
        System.out.println("=====================================");


        while (true) {
            System.out.println("发送东西");
            String msg = scanner.next();
            小久.send(msg,sendAndReceiveContain);
            System.out.println("=====================================");
            System.out.println("父母让惜己帮自己给小久带点东西");
            String msg2 = scanner.next();
            父母.send(msg2,sendAndReceiveContain1);
        }

    }
}

7)运行结果

小久==>土特产==>惜己==>小久父母+土特产

父母==》妈妈的毛衣===》惜己===》小久+妈妈的毛衣

相关推荐
用户2986985301412 分钟前
Java 创建 CSV 文件的三种实用方法:从零构建、数组写入与 Excel 转换
java·后端·excel
Cry丶19 分钟前
一次 FTP 上传引发 504 Gateway Timeout 的排查复盘
java·nginx·ftp·openresty·被动模式·504 gateway·生产问题排查
咖啡八杯22 分钟前
GoF设计模式——责任链模式
设计模式·面试·架构
码农进化录25 分钟前
Java 程序员的 AI 进化论 | AI 辅助 CI/CD,让 AI 帮你做代码审查和部署决策
java·spring boot·openai
zyplayer-doc27 分钟前
企业文档的进化:网盘和在线文档的下一个升级方向—知识库系统
java·大数据·数据库·人工智能·ocr
吃饱了得干活31 分钟前
从零设计一个高并发点赞系统:缓存+MQ异步持久化实战
java·架构
奇牙coding37 分钟前
gpt-5.6-luna 调用报 400 bad_request 怎么办?同样的 messages 在 gpt-5.5 没问题——两处校验差异和修复写法
java·windows·gpt·ai
凤山老林1 小时前
从“无法创建本地线程“异常说起:深度解析线程栈与JVM线程优化指南
java·开发语言·jvm
聚美智数1 小时前
常见疾病查询-疾病症状—疾病介绍-疾病大全-疾病治疗查询API接口介绍
android·java·数据库
慧都小妮子1 小时前
Aspose.Words for JasperReports v26.6 发布,底层Java大升级
java·pdf·报表工具·aspose.words·文档转换·报表导出·jasperreports