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

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

1.中介者模式定义

        定义一个单独的(中介)对象,来封装一组对象之间的交互,将这组对象之间的交互委派给中介对象交互,从而避免对象之间的交互;

        中介者模式主要解决对象间的交互复杂性问题,而代理模式则主要用于控制对某个对象的访问;

1.1 中介者模式的优缺点

优点

  • 简化了对象之间的交互,易于维护和扩展,将原本难以理解的网状结构换成了相对简单的星型结构;
  • 可以将各个同事对象进行解耦,可以独立的改变或者复用每一个同事或中介者,增加新的中介者类,增加新的中介者类和新的同事类比较方便,符合开闭原则;
  • 可以减少子类生成,中介者将原本分布在多个对象的行为集中在了一起,改变这些行为只需要生成新的中介者的子类即可,使得同事类可以被复用,无需直接对同事类进行扩展;

缺点

  • 在具体中介者类中包含了大量同事类之间的交互细节,可能会导致中介者类非常复杂,使得系统不好维护;

1.2 中介者模式的使用场景

  • 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解的情况;
  • 一个对象由于引用了其他的很多对象且直接和这些对象进行通信,导致对象难以复用的情况;
  • 想要通过一个中间类来封装多个类中的行为,而又不想生成太多子类的情况;

2.中介者模式的原理

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

3.中介者模式的实现

【实例】

        以租房为例,房东、中介与租房者之间的关系;

【代码】

        抽象中介者

public abstract class Mediator {

    //申明一个联络方法
    public abstract void contact(String message,Person person);
}

        抽象同事类

public abstract class Person {

    protected String name;
    protected Mediator mediator;

    public Person(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}

        房产中介

public class MediatorStructure extends Mediator {

    //中介要知晓房主和租房者的信息
    private HouseOwner houseOwner;
    private Tenant tenant;
    public HouseOwner getHouseOwner() {
        return houseOwner;
    }
    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }
    public Tenant getTenant() {
        return tenant;
    }
    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }
    @Override
    public void contact(String message, Person person) {
        if(person == houseOwner){  //如果是房主,则租房者获得信息
            tenant.getMessage(message);
        }else { //如果是租房者则获取房主信息
            houseOwner.getMessage(message);
        }
    }
}

         具体同事类-房东

public class HouseOwner extends Person{

    public HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }
    //与中介者联系
    public void contact(String message){
        mediator.contact(message,this);
    }
    //获取信息
    public void getMessage(String message){
        System.out.println("房主" + name + "获取到的信息: " + message);
    }
}

        具体同事类-租房者

public class Tenant extends Person{

    public Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }
    //与中介者联系
    public void contact(String message){
        mediator.contact(message,this);
    }
    //获取信息
    public void getMessage(String message){
        System.out.println("租房者" + name + "获取到的信息: " + message);
    }
}

        客户端

public class Client {

    public static void main(String[] args) {

        //一个房主 一个租房者 一个中介机构
        MediatorStructure mediator = new MediatorStructure();
        //房主和租房者只需要知道中介机构即可
        HouseOwner houseOwner = new HouseOwner("路飞", mediator);
        Tenant tenant = new Tenant("娜美", mediator);
        //中介收集房租和租房者信息
        mediator.setHouseOwner(houseOwner);
        mediator.setTenant(tenant);
        tenant.contact("需要一个两室一厅的房子,一家人住");
        houseOwner.contact("出租一套两室一厅带电梯,月租3000");
    }
}

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

相关文章:

  • 机器学习、深度学习面试知识点汇总
  • 企业如何提高招聘能力?
  • Vue的基础使用
  • 轮转数组
  • Java NIO 深度解析:构建高效的 I/O 操作
  • 【大数据学习 | HBASE高级】storeFile文件的合并
  • 【C#】DllImport的使用
  • 力扣19 删除链表的倒数第N个节点 Java版本
  • eBPF系列:开发流程
  • 【HarmonyOS】鸿蒙仿iOS线性渐变实现
  • 如何像专家一样修复任何 iPhone 上的“iPhone 已禁用”错误
  • 【Go】Go语言切片(Slice)深度剖析与应用实战
  • chsharp文件如何查找在unity中使用的 位置?
  • 【React】组件通信
  • docker windows下清理后,磁盘空间未释放原因及解决方法
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-27
  • Linux之我不会
  • 【stm32】TIM定时器输出比较-PWM驱动LED呼吸灯/舵机/直流电机
  • 使用Ruby进行视频内容的自动化分析
  • springboot+大数据基于数据挖掘的招聘信息可视化大屏系统【内含源码+文档+部署教程】
  • 调用飞书接口导入供应商bug
  • 高级java每日一道面试题-2024年9月26日-运维篇[分布式篇]-如何保证每个服务器的时间都是同步的?
  • 【vue-media-upload 升级玩法】一个页面用两个Uploader,一个上传图片,一个上传视频(分开传,容易分开设置和展示图片和视频)
  • 解决远程连接AlpineLinux Mysql/MariaDB 无法连接的问题
  • FortiGate 无线组网
  • 深度学习:卷积神经网络CNN