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

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

中介者模式

基本定义

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

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

模式结构

  • 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套

优点

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

缺点

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

应用场景

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

总结

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

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

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

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

相关推荐
Pniubi9 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko710 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师10 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.10 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼11 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说12 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐14 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
高晶14 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
const_qiu14 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog14 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友