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

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

中介者模式

定义

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

结构

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

案例实现

租房:房主将房屋托管给中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。

类图如下:

java 复制代码
/**
 * 抽象中介者类
 */
public abstract class Mediator {

    public abstract void constact(String message,Person person);
}
java 复制代码
/**
 * 具体的中介者
 */
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);
        }
    }
}
java 复制代码
/**
 * 抽象同事类
 */
public abstract class Person {
    protected String name;
    protected Mediator mediator;

    public Person(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}
java 复制代码
/**
 * 具体同事类
 */
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);
    }
}
java 复制代码
/**
 * 房主类
 */
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);
    }
}
java 复制代码
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");
    }
}

优缺点

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

使用场景

  • 当系统中对象之间复杂的引用关系,系统结构混乱且难以理解。
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。
相关推荐
李广坤7 小时前
状态模式(State Pattern)
设计模式
李广坤8 小时前
观察者模式(Observer Pattern)
设计模式
李广坤9 小时前
中介者模式(Mediator Pattern)
设计模式
李广坤9 小时前
迭代器模式(Iterator Pattern)
设计模式
李广坤10 小时前
解释器模式(Interpreter Pattern)
设计模式
阿无,12 小时前
java23种设计模式之前言
设计模式
Asort13 小时前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机13 小时前
数据工程设计模式——数据基础
大数据·设计模式·架构
笨手笨脚の16 小时前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式
Overboom1 天前
[C++] --- 常用设计模式
开发语言·c++·设计模式