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

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

中介者模式

定义

又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立的改变它们之间的交互。

结构

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

案例实现

租房:房主将房屋托管给中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。
类图如下:
在这里插入图片描述

/**
 * 抽象中介者类
 */
public abstract class Mediator {
   

    public abstract void constact(String message,Person person);
}
/**
 * 具体的中介者
 */
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 constact(String message, Person person) {
   
        if (person == houseOwner){
   
            tenant.getMessage(message);
        } else {
   
            houseOwner.getMessage(message);
        }
    }
}
/**
 * 抽象同事类
 */
public abstract class Person {
   
    protected String name;
    protected Mediator mediator;

    public Person(String name, Mediator mediator) {
   
        this.name = name;
        this.mediator = mediator;
    }
}
/**
 * 具体同事类
 */
public class Tenant extends Person {
   
    public Tenant(String name, Mediator mediator) {
   
        super(name, mediator);
    }

    // 和中介沟通的方法
    public void constact(String message) {
   
        mediator.constact(message, this);
    }

    // 获取信息的方法
    public void getMessage(String message) {
   
        System.out.println("租房者" + name + "获取到的信息是" + message);
    }
}
/**
 * 房主类
 */
public class HouseOwner extends Person{
   
    public HouseOwner(String name, Mediator mediator) {
   
        super(name, mediator);
    }
    // 和中介沟通的方法
    public void constact(String message) {
   
        mediator.constact(message, this);
    }

    // 获取信息的方法
    public void getMessage(String message) {
   
        System.out.println("房主" + name + "获取到的信息是" + message);
    }
}
public class Test01 {
   
    public static void main(String[] args) {
   
        // 创建中介者对象
        MediatorStructure mediatorStructure = new MediatorStructure();
        // 创建租房者对象
        Tenant tenant = new Tenant("张三", mediatorStructure);
        // 创建房主对象
        HouseOwner houseOwner = new HouseOwner("李四", mediatorStructure);
        // 中介要知道具体的房主和租客
        mediatorStructure.setTenant(tenant);
        mediatorStructure.setHouseOwner(houseOwner);
        // 租客和房主都是通过中介来获取的信息、并进行沟通
        tenant.constact("我想租一个两室一厅");
        houseOwner.constact("2500一个月,年租2万5");
    }
}

在这里插入图片描述

优缺点

  • 优点:
    • 松散耦合,中介者通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样同事对象就可以独立的变化和复用。
    • 集中控制交互,多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了,当然如果是已经做好的系统,那么就扩展中介者对象,而各个同事类不需要修改。
    • 一对多关联转变为一对一关联,没有使用中介者模式时,同事对象之间的关系通常是一对多的,引入中介者对象之后,中介者对象和同事对象的关系通常变成双向的一对一,这会让对象的关系更容易理解和实现。
  • 缺点:
    • 当同事类太多时,中介者的职责将很大,它会变得复杂庞大以至于难以维护

使用场景

  • 当系统中对象之间复杂的引用关系,系统结构混乱且难以理解。
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。

相关推荐

  1. 行为设计模式中介模式

    2023-12-16 20:08:02       57 阅读
  2. 设计模式行为设计模式——中介模式

    2023-12-16 20:08:02       44 阅读
  3. 设计模式行为模式中介模式

    2023-12-16 20:08:02       46 阅读
  4. 设计模式(十二):中介模式行为模式

    2023-12-16 20:08:02       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-16 20:08:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-16 20:08:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-16 20:08:02       82 阅读
  4. Python语言-面向对象

    2023-12-16 20:08:02       91 阅读

热门阅读

  1. 同步消息与同步请求消息在嵌入式系统中的应用

    2023-12-16 20:08:02       56 阅读
  2. vuedraggable的使用

    2023-12-16 20:08:02       64 阅读
  3. 深入理解Golang中的goroutine 池

    2023-12-16 20:08:02       59 阅读
  4. C语言实现简单的不平衡二叉搜索树

    2023-12-16 20:08:02       60 阅读
  5. 音视频处理相关软件

    2023-12-16 20:08:02       62 阅读
  6. 数据标准与数据字典的区别和联系

    2023-12-16 20:08:02       58 阅读
  7. 【数据结构】——排序算法简答题模板

    2023-12-16 20:08:02       52 阅读