您现在的位置是:首页 > 编程 > 

设计模式(十九):行为型之中介者模式

2025-07-20 21:49:15
设计模式(十九):行为型之中介者模式 一、设计模式分类创建型模式 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式结构型模式 用于描述如何将类或对象按某种布局组成更大的结构提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任

设计模式(十九):行为型之中介者模式

一、设计模式分类
  • 创建型模式
    • 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”
    • 提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式
  • 结构型模式
    • 用于描述如何将类或对象按某种布局组成更大的结构
    • 提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式
  • 行为型模式
    • 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责
    • 提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器 11 种行为型模式
二、中介者模式

1、概述

  • 同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构
  • 例如在下左图中,有六个同事类对象,假如对象1发生变化,那么将会有4个对象受到影响
  • 如果引入中介者模式,从下右图中可以看到,任何一个类的变动,只会影响的类本身,以及中介者

定义

  • 定义一个中介角来封装一系列对象之间的交互
  • 使原有对象之间的耦合松散,且可以独立地改变它们之间的交互

2、结构

中介者模式包含以下主要角:

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

、实现

【例】租房

  • 现在租房基本都是通过房屋中介,房主将房屋托管给房屋中介
  • 而租房者从房屋中介获取房屋信息
  • 房屋中介充当租房者与房屋所有者之间的中介者

类图如下:

代码如下:

  • 抽象中介者
代码语言:javascript代码运行次数:0运行复制
public abstract class Mediator {
    //申明一个联络方法
    public abstract void ctact(String message,Person person);
}
  • 抽象同事类
代码语言:javascript代码运行次数:0运行复制
public abstract class Person {
    protected String name;
    protected Mediator mediator;

    public Person(String name,Mediator mediator){
         = name;
         = mediator;
    }
}
  • 具体同事类
  • 构造函数将具体中介聚合进来,房东和租客都需要与中介联系
代码语言:javascript代码运行次数:0运行复制
//具体同事类 房屋拥有者
public class HouseOwner extends Person {

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

    //与中介者联系
    public void ctact(String message){
        (message, this);
    }

    //获取信息
    public void getMessage(String message){
        println("房主:[" + name + "] 获取到的信息是:【" + message + "】");
    }
}

//具体同事类 租房者
public class Tenant extends Person {
    public Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }

    //与中介者联系
    public void ctact(String message){
        (message, this);
    }

    //获取信息
    public void getMessage(String message){
        println("租房者:[" + name + "] 获取到的信息是:【" + message + "】");
    }
}
  • 中介机构
  • 中介机构聚合了租房者和房主两人
代码语言:javascript代码运行次数:0运行复制
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) {
         = tenant;
    }

	@Override
    public void ctact(String message, Person person) {
        if (person == houseOwner) {  //如果是房主,则租房者获得信息
            tenant.getMessage(message);
        } else {                     //反正则是房主获得信息
            houseOwner.getMessage(message);
        }
    }
}
  • 测试类
  • 房东和租客与中介联系后,中介这里就会去判断
    • 房东发出,则中介转发给租客
    • 租客发出,则中介转发给房东
代码语言:javascript代码运行次数:0运行复制
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);

        ("需要租三室的房子");
        ("我这有三室的房子,你需要租吗?");
    }
}

输出结果:

房主:[张三] 获取到的信息是:【我要租三室的房子!!!】
租房者:[李四] 获取到的信息是:【我这里有三室的房子,你要租吗?】

4、优缺点

优点

  • 松散耦合
    • 中介者模式通过把多个同事对象之间的交互封装到中介者对象里面
    • 从而使得同事对象之间松散耦合,基本上可以做到互补依赖
    • 这样一来,同事对象就可以独立地变化和复用,而不再像以前那样“牵一处而动全身”了
  • 集中控制交互
    • 多个同事对象的交互,被封装在中介者对象里面集中管理
    • 使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了
    • 当然如果是已经做好的系统,那么就扩展中介者对象,而各个同事类不需要做修改
  • 一对多关联转变为一对一的关联
    • 没有使用中介者模式的时候,同事对象之间的关系通常是一对多的
    • 引入中介者对象以后,中介者对象和同事对象的关系通常变成双向的一对一

缺点

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

5、使用场景

  • 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-06-26,如有侵权请联系 cloudcommunity@tencent 删除系统public对象接口设计模式

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1161666.html

相关标签:无
上传时间: 2025-07-20 17:25:19
留言与评论(共有 19 条评论)
本站网友 江淮汽车公司
3分钟前 发表
同事对象就可以独立地变化和复用
本站网友 勇敢者乐园
16分钟前 发表
由中介者对象负责后续的交互
本站网友 南京日语培训
26分钟前 发表
迭代器
本站网友 新华医院儿科
5分钟前 发表
结构中介者模式包含以下主要角:抽象中介者(Mediator)角:它是中介者的接口
本站网友 炼狱天堂
27分钟前 发表
状态
本站网友 44248
8分钟前 发表
又不想生成新的子类时本文参与 腾讯云自媒体同步曝光计划
本站网友 谷狗搜索
6分钟前 发表
访问者
本站网友 ip地址更改助手
28分钟前 发表
Person person); }抽象同事类代码语言:javascript代码运行次数:0运行复制public abstract class Person { protected String name; protected Mediator mediator; public Person(String name
本站网友 危险期计算
18分钟前 发表
使用场景系统中对象之间存在复杂的引用关系
本站网友 恶心的图片
20分钟前 发表
原始发表:202-06-26
本站网友 女主工作室
4分钟前 发表
多个同事类之间互相关联时
本站网友 费敏
9分钟前 发表
中介这里就会去判断 房东发出
本站网友 成都七中网校
30分钟前 发表
Person person); }抽象同事类代码语言:javascript代码运行次数:0运行复制public abstract class Person { protected String name; protected Mediator mediator; public Person(String name
本站网友 石化工业
12分钟前 发表
那么就扩展中介者对象
本站网友 香樟路租房
15分钟前 发表
抽象工厂
本站网友 输入法无法切换
9分钟前 发表
解释器 11 种行为型模式二
本站网友 快捷方式小箭头
17分钟前 发表
Mediator mediator){ = name; = mediator; } }具体同事类构造函数将具体中介聚合进来
本站网友 华宝国际
8分钟前 发表
外观