设计模式(行为型设计模式——中介者模式)

设计模式(行为型设计模式------中介者模式)

中介者模式

基本定义

所谓中介者模式就是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介者模式又叫调停者模式,它是迪米特法则的典型应用。

模式结构

  • Mediator: 抽象中介者。定义了同事对象到中介者对象之间的接口。
  • ConcreteMediator: 具体中介者。实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
  • Colleague: 抽象同事类。
  • ConcreteColleague: 具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

代码实现

Mediator: 抽象中介者。
java 复制代码
public abstract class Mediator {
    //收集信息,转发信息
    public abstract void contact(String message, Person person);
}
ConcreteMediator: 具体中介者,核心类。
java 复制代码
/*
 * @Description 具体中介者类(核心类):转发信息,负责转发给对应同事类
 * 代理模式与中介模式的区别:
 * 1、中介者模式支持买家和卖家信息沟通(获取房源,商谈价格),中介模式作用是解耦对象之间的关系
 * 2、代理模块可以办理买房手续,单方交互, 代理模式作用是增强对象的能力
*/
@Getter
@Setter
@Slf4j
public class ConcreteMediator extends Mediator {


    private Seller seller;
    private Buyer buyer;


    //转发消息
    @Override
    public void contact(String message, Person person) {
        //如果是卖家,信息交给买家处理
        if(person instanceof  Seller){
            buyer.getMessage(message);
        }else if(person instanceof Buyer){
            seller.getMessage(message);
        }else {
            log.error("未知类型:{}", person.getClass().getName());
        }
    }
}
Colleague: 抽象同事类。
java 复制代码
@Setter
@Getter
public abstract class Person {
    String name;
    Mediator mediator;


    public Person(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}
ConcreteColleague: 具体同事类。
java 复制代码
/**
 * @Description ConcreteColleague 具体同事类
 * 买家 中介者需要联系的一方存在
 **/
@Slf4j
public class Buyer extends Person {


    public Buyer(String name, Mediator mediator) {
        super(name, mediator);
    }


    //联系中介者
    public void contact(String message){
        mediator.contact(message, this);
    }


    //处理消息
    public void getMessage(String message){
        log.info("买家:{}, 收到信息:{}", super.name, message);
    }
}
java 复制代码
/**
 * @Description ConcreteColleague 具体同事类
 * 卖家 中介者需要联系的一方存在
 **/
@Slf4j
public class Seller extends Person {


    public Seller(String name, Mediator mediator) {
        super(name, mediator);
    }


    //联系中介者
    public void contact(String message){
        mediator.contact(message, this);
    }


    //处理消息
    public void getMessage(String message){
        log.info("卖家:{}, 收到信息:{}", super.name, message);
    }
}
测试类
java 复制代码
public class Test {


    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        Seller seller = new Seller("宋江", mediator);
        Buyer buyer = new Buyer("矮脚虎", mediator);


        mediator.setSeller(seller);
        mediator.setBuyer(buyer);


        seller.contact("我有三十套房, 打算卖10套");
        buyer.contact("我要买套房, 打算买1套");
    }
}
输出结果

买家:矮脚虎, 收到信息:我有三十套房, 打算卖10套 卖家:宋江, 收到信息:我要买套房, 打算买1套

优点

  • 简化了对象之间的关系,将各个同事类解耦,使系统成为松耦合系统。
  • 对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

缺点

当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。

应用场景

  • 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

总结

  • 在中介者模式中通过引用中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少。它简化了系统的结构,将系统由负责的网状结构转变成简单的星形结构,中介者对象在这里起到中转和协调作用。

  • 中介者类是中介者模式的核心,它对整个系统进行控制和协调,简化了对象之间的交互,还可以对对象间的交互进行进一步的控制。

  • 具体的同事类可以独立变化,通过引用中介者可以简化同事类的设计和实现。

  • 就是由于中介者对象需要知道所有的具体同事类,封装具体同事类之间相互关系,导致中介者对象变得非常复杂,当同事类过多时,系统维护起来较为困难。

相关推荐
论迹9 分钟前
【JavaEE】-- 多线程(初阶)2
java·开发语言·java-ee
桃子是唯一的水果18 分钟前
java 单例模式(Lazy Initialization)实现遍历文件夹下所有excel文件且返回其运行时间
java·单例模式·maven
+72019 分钟前
如何在java中用httpclient实现rpc post 请求
java·开发语言·rpc
ybq1951334543121 分钟前
javaEE-SpringBoot日志
java·spring boot·后端
火烧屁屁啦25 分钟前
【JavaEE进阶】图书管理系统 - 贰
java·spring
xzzd_jokelin25 分钟前
Spring AI 接入 DeepSeek:开启智能应用的新篇章
java·人工智能·spring·ai·大模型·rag·deepseek
刘什么洋啊Zz36 分钟前
剖析IO原理和零拷贝机制
java·运维·网络
卷心菜好6啊43 分钟前
特辣的海藻!2
java
心态与习惯1 小时前
mac 下 java 调用 gurobi 不能加载 jar
java·jar·mac·cplex·gurobi
he258191 小时前
centOS 7.9 安装JDK MYSQL
java·mysql·centos