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

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

中介者模式

定义

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

结构

  • 抽象中介者角色(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");
    }
}

优缺点

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

使用场景

  • 当系统中对象之间复杂的引用关系,系统结构混乱且难以理解。
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。
相关推荐
wrx繁星点点7 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干9 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨9 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉18 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点18 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰18 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus19 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵19 小时前
设计模式-迭代器
设计模式
lexusv8ls600h20 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
sniper_fandc1 天前
抽象工厂模式
java·设计模式·抽象工厂模式