中介者模式介绍

本文详细介绍了中介者模式的定义、原理,通过租房中介场景进行应用演示。阐述了模式的优点如解耦、维护性和扩展性,同时也指出了其可能的复杂性和局限性,适合对象间复杂交互和结构混乱的系统。
摘要由CSDN通过智能技术生成

目录

一、中介者模式介绍

1.1 中介者模式定义

1.2 中介者模式原理

1.2.1 中介者模式类图

1.2.2 模式角色说明

1.2.3 示例代码

二、中介者模式的应用

2.1 需求说明

2.2 需求实现

2.2.1 抽象同事类

2.2.2 具体同事类-房屋拥有者

2.2.3 具体同事类-承租人

2.2.4 抽象中介者

2.2.5 中介机构

2.2.6 测试类

三、中介者模式总结

3.1 中介者模式的优点

3.2 中介者模式的缺点

3.3 中介者模式的使用场景


一、中介者模式介绍

1.1 中介者模式定义

中介模式(mediator pattern)的定义:定义一个单独的(中介)对象,来封装一组对象之间的交互,将这组对象之间的交互委派给予中介对象交互,来避免对象之间的交互。

中介者对象就是用于处理对象与对象之间的直接交互,封装了多个对象之间的交互细节。中介模式的设计跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系从多对多的网状关系转换为一对多的星状关系。原来一个对象要跟N个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低代码的复杂度,提高代码的可读性和可维护性。

提到中介模式,有一个比较经典的例子就是航空管制。 为了让飞机在飞行的时候互不干扰,每架飞机都需要知道其他飞机每时每刻的位置,这就需要时刻跟其他飞机通信。飞机通信形成的通信网络就会无比复杂。这个时候,我们通过引 入“塔台”这样一个中介,让每架飞机只跟塔台来通信,发送自己的位置给塔台,由塔台来 负责每架飞机的航线调度。这样就大大简化了通信网络。

1.2 中介者模式原理

1.2.1 中介者模式类图

1.2.2 模式角色说明

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

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

1.2.3 示例代码

package main.java.cn.test.mediator.V1;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:16:18
 * @description 抽象中介者
 */
public interface Mediator {
    void apply(String key);
}

package main.java.cn.test.mediator.V1;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:16:45
 * @description 具体中介者
 */
public class MediatorImpl implements Mediator {
    @Override
    public void apply(String key) {
        System.out.println("最终中介者执行操作,key为: " + key);
    }
}

package main.java.cn.test.mediator.V1;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:17:20
 * @description 抽象同事类
 */
public abstract class Colleague {
    private Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public Mediator getMediator() {
        return mediator;
    }

    public abstract void exec(String key);
}

package main.java.cn.test.mediator.V1;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:18:03
 * @description 具体同事类A
 */
public class ConcreteColleagueA extends Colleague {


    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void exec(String key) {
        System.out.println("====在组件A中,通过中介者执行!");
        getMediator().apply(key);
    }
}

package main.java.cn.test.mediator.V1;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:18:47
 * @description 具体同事类B
 */
public class ConcreteColleagueB extends Colleague {
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void exec(String key) {
        System.out.println("====在组件B中,通过中介者执行!");
        getMediator().apply(key);
    }
}

package main.java.cn.test.mediator.V1;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:19:38
 * @description 测试类
 */
public class Test {
    public static void main(String[] args) {
        //创建中介者
        MediatorImpl mediator = new MediatorImpl();
        //创建同事对象
        Colleague c1 = new ConcreteColleagueA(mediator);
        c1.exec("key-A");
        Colleague c2 = new ConcreteColleagueB(mediator);
        c2.exec("key-B");
    }
}

二、中介者模式的应用

2.1 需求说明

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

2.2 需求实现

2.2.1 抽象同事类

package main.java.cn.test.mediator.V2;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:24:25
 * @description 抽象同事类
 */
public abstract class Person {
    protected String name;
    protected Mediator mediator;

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

}

2.2.2 具体同事类-房屋拥有者

package main.java.cn.test.mediator.V2;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:25:30
 * @description 具体同事类-房屋拥有者
 */
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);
    }
}

2.2.3 具体同事类-承租人

package main.java.cn.test.mediator.V2;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:26:10
 * @description 具体同事类-承租人
 */
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);
    }
}

2.2.4 抽象中介者

package main.java.cn.test.mediator.V2;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:23:53
 * @description 抽象中介者
 */
public abstract class Mediator {
    //申明一个联络方法
    public abstract void contact(String message, Person person);
}

2.2.5 中介机构

package main.java.cn.test.mediator.V2;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:25:00
 * @description 中介机构
 */
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);
        }

    }
}

2.2.6 测试类

package main.java.cn.test.mediator.V2;

/**
 * @author ningzhaosheng
 * @date 2024/1/15 21:28:36
 * @description 测试类
 */
public class Test {
    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("出租一套两室一厅带电梯,月租5000");
    }
}

三、中介者模式总结

3.1 中介者模式的优点

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

3.2 中介者模式的缺点

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

3.3 中介者模式的使用场景

  • 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
  • 一个对象由于引用了其他的很多对象并且直接和这些对象进行通信,导致难以复用该对象。
  • 想要通过一个中间类来封装多个类中的行为,而又不想生成太多的子类,此时可以通过引用中介者类来实现,在中介者类中定义对象的交互的公共行为,如果需要改变行为则可以在增加新的中介类。

好了,本次分享就到这里,欢迎大家继续阅读《设计模式》专栏其他设计模式内容,如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
终端终结者是一个在Ubuntu上使用的终端模拟器。您可以按照以下步骤来安装和使用终端终结者: 1. 打开终端(按下Ctrl+Alt+T)。 2. 运行以下命令来安装终端终结者:sudo apt-get install terminator 3. 安装完成后,您可以通过在应用程序菜单中搜索“终端终结者”或在终端中运行“terminator”命令来打开它。 4. 一旦打开终端终结者,您可以右键单击终端窗口,并选择“水平”或“垂直”方向来扩展一个新的终端。这样,您就可以在一个窗口中同时操作多个终端。 如果遇到终端终结者无响应的问题,可能是由于系统默认的Python版本设置为Python 3导致的。这时您可以按照以下方法解决: 1. 打开终端终结者的启动文件。您可以通过运行以下命令来找到启动文件的位置:which terminator 2. 打开启动文件并进行编辑。例如,如果启动文件是“/usr/bin/terminator”,则可以运行以下命令来编辑它:sudo nano /usr/bin/terminator 3. 在打开的文件中,找到以“#!/usr/bin/python”开头的一行,并将其修改为“#!/usr/bin/python2”。 4. 保存并关闭文件。 5. 再次尝试运行终端终结者,应该可以正常启动了。 希望这些信息能够帮助您解决问题。如果您有任何其他相关问题,请随时提问。 相关问题: 1. 如何卸载终端终结者? 2. 如何在终端终结者中创建自定义布局? 3. 如何在终端终结者中设置快捷键?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值