当前位置: 首页 > article >正文

Java设计模式(十八)中介者模式

一、概述

中介者模式是一种行为型设计模式,用于减少对象之间的直接耦合关系,通过引入一个中介者对象来协调不同对象之间的交互。

在中介者模式中,中介者对象充当一个调度器的角色,负责协调不同对象之间的通信和动作。不同的对象之间不直接相互通信,而是通过中介者对象来进行通信和协调。

下面是一个中介者模式的代码示例,其中我们定义了一个抽象中介者类 Mediator 和具体的中介者类 ConcreteMediator。在 ConcreteMediator 中,我们定义了不同的同事类对象 Colleague,并实现了中介者协调不同对象之间的通信和协作的方法。同事类对象 Colleague 中则定义了发送消息和接收消息的方法。这样,不同的同事类对象之间就可以通过中介者对象进行通信和协作。

二、代码

//1.抽象中介者类
public abstract class Mediator {
    //将消息发送给colleague
    public abstract void send(String message, Colleague colleague);
}
//2.抽象同事类
public abstract class Colleague {
    protected Mediator mediator;

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

    public abstract void send(String message);

    public abstract void receive(String message);
}
//3.具体中介者类
public class ConcreteMediator extends Mediator {
    private Colleague colleague1;
    private Colleague colleague2;

    public void setColleague1(Colleague colleague1) {
        this.colleague1 = colleague1;
    }

    public void setColleague2(Colleague colleague2) {
        this.colleague2 = colleague2;
    }

    public void send(String message, Colleague colleague) {
        //判断应该把消息发给哪个colleague
        if (colleague == colleague1) {
            colleague2.receive(message);
        } else {
            colleague1.receive(message);
        }
    }
}
//4.具体同事类1
public class ConcreteColleague1 extends Colleague {
    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    /**
     * 将消息发给自己的mediator
     * @param message
     */
    @Override
    public void send(String message) {
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("ConcreteColleague1 received message: " + message);
    }
}
//5.具体同事类2
public class ConcreteColleague2 extends Colleague {
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    /**
     * 将消息发给自己的mediator
     * @param message
     */
    @Override
    public void send(String message) {
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("ConcreteColleague2 received message: " + message);
    }
}
//6.测试类
public class Test {
    public static void main(String[] args) {
        //创建中介者和两个colleague
        ConcreteMediator mediator = new ConcreteMediator();
        //两个colleague都和中介关联
        ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
        mediator.setColleague1(colleague1);
        mediator.setColleague2(colleague2);

        //通过中介者实现消息转发
        colleague1.send("Hello from colleague1!");
        colleague2.send("Hello from colleague2!");
    }
}

在上述代码中,我们定义了抽象中介者类 Mediator,其中包含了 send() 方法用于发送消息,并且具体的中介者类 ConcreteMediator 继承自 Mediator 并实现了 send() 方法。中介者类持有不同的同事类对象,并根据发送消息的同事类选择合适的接收者进行消息的转发。

抽象同事类 Colleague 定义了发送消息和接收消息的抽象方法,并持有一个中介者对象。具体的同事类 ConcreteColleague1ConcreteColleague2 继承自 Colleague 并实现了抽象方法。在发送消息时,同事类会调用中介者对象的 send() 方法,将消息发送给中介者。

在测试代码中,我们创建了中介者对象 ConcreteMediator,以及具体的同事类对象 ConcreteColleague1ConcreteColleague2。然后我们将同事对象与中介者对象关联起来,通过调用中介者对象的 setColleague1()setColleague2() 方法进行设置。

在测试代码的最后,我们通过同事对象的 send() 方法发送消息。当同事对象调用 send() 方法时,实际上是通过中介者对象的 send() 方法进行消息的发送和协调。中介者根据接收到的消息以及发送消息的同事对象,决定将消息转发给哪个同事对象。


http://www.kler.cn/a/18094.html

相关文章:

  • windows中docker安装redis和redisinsight记录
  • ffmpeg 视频滤镜:屏蔽边框杂色- fillborders
  • 网站架构知识之Ansible模块(day021)
  • 【C知道】CSS3重要特性。
  • 【css flex 多行均分有间隙布局】
  • qt QColorDialog详解
  • Nacos注册中心一些配置说明
  • 《Netty》从零开始学netty源码(五十三)之PoolThreadCache的功能
  • MySQL面试八股文:索引篇
  • 我把Solon打包成了native image,速度快的惊人
  • 【linux的学习与软件安装】
  • 计算机操作系统实验:页面置换算法的实现
  • 充电桩测试设备TK4800充电桩现校仪检定装置
  • MySQL优化二索引使用
  • 信息安全从业人员职业规划(甲方乙方分别说明)
  • 中兴B860AV2.1-T(M)-高安版-当贝纯净桌面线刷固件包
  • Facebook 用户量十分庞大,为什么还使用 MySQL 数据库?
  • IDEA沉浸式编程体验
  • 锁相环技术,单边带信号,信号的调制
  • MySQL数据库之索引
  • 【SpringMVC】三、SpringMVC获取请求参数与域数据共享
  • Ubuntu20.04安装Vtk9.2.6+PCL1.12.1(成功无报错)
  • 使用asp.net core web api创建web后台,并连接和使用Sql Server数据库
  • Flink dataStream,如何开窗,如何进行窗口内计算
  • BM54-三数之和
  • 盲目自学网络安全只会成为脚本小子?