设计模式:中介者模式(Mediator)

简介: 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。 中介者模式中的角色: 1. 抽象中介者(Mediator):定义了同事对象到中介者对象之间的接口。

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
这里写图片描述

中介者模式中的角色:
1. 抽象中介者(Mediator):定义了同事对象到中介者对象之间的接口。
2. 具体中介者(ConcreteMediator):定义抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收消息,并且向具体的同事类发送信息。
3. 抽象同事类(Colleague)
4. 具体同事类(ConcreteColleague):每个具体同事类都只需要知道自己的行为即可,但是它们都需要认识中介者。

案例1:
房屋租赁中介就是一个很好的中介模式,租客只知道自己和中介,房东也只知道自己和中介,但是中介必须知道租客和房东。(在我们的生活中处处充斥着“中介者”,比如租房、买房、出过留学、找工作、旅游等可能都需要哪些中介者的帮助。)
1 抽象中介者

public interface Mediator
{
    void contact(String message, Person person);
}

2 抽象同事类

public abstract class Person
{
    protected String name;
    protected Mediator mediator;

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

3 具体同事类
房东:

public class HouseOwner extends Person
{
    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("HouseOwner : "+name+", Get Message: "+message);
    }
}

租客:

public class Tenant extends Person
{
    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("Tenant : "+name+", Get Message: "+message);
    }
}

4 中介

public class MediatorStructure implements 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);
        }
    }
}

5 测试代码

        MediatorStructure mediator = new MediatorStructure();

        HouseOwner houseOwner = new HouseOwner("qq",mediator);
        Tenant tenant = new Tenant("jj",mediator);

        mediator.setHouseOwner(houseOwner);
        mediator.setTenant(tenant);

        tenant.contact("I wanna a house");
        houseOwner.contact("I have~");

运行结果:

HouseOwner : qq, Get Message: I wanna a house
Tenant : jj, Get Message: I have~

优缺点
优点

  1. 适当的使用中介者模式可以避免同事类之间的过渡耦合,使得各同事类之间可以相对独立地使用。
  2. 减少子类的生成。
  3. 可以减少各同事类的设计与实现。

缺点
1. 由于中介者对象封装了系统中的对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难。中介者需要知道每个对象和他们之间的交互细节,如果它出问题,将会导致整个系统都会出现问题。所以它比较容易应用也很容易误用。故当系统中出现了“多对多”交互复杂的关系群时,千万别记着使用中介者模式,你首先需要做的就是反思你的系统在设计上是不是合理。再者,在实际工作中,中介者模式也并不多见。


适用场景
1. 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

JDK中的中介者模式:
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()


参考资料
1. 23种设计模式
2. 细数JDK里的设计模式
3. 设计模式读书笔记—–中介者模式

目录
相关文章
|
3月前
|
设计模式 Java
Java设计模式-中介者模式(20)
Java设计模式-中介者模式(20)
|
4月前
|
设计模式 前端开发 Java
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
文章详细介绍了中介者模式(Mediator Pattern),这是一种对象行为型模式,用于封装一系列对象的交互,降低系统耦合度,并简化对象之间的交互关系。通过案例分析、结构图、时序图和代码示例,文章展示了中介者模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 中介者模式
js设计模式【详解】—— 中介者模式
71 5
|
6月前
|
设计模式
中介者模式-大话设计模式
中介者模式-大话设计模式
|
6月前
|
设计模式 Java 程序员
Java设计模式之中介者模式详解
Java设计模式之中介者模式详解
|
7月前
|
设计模式
设计模式之调停者 Mediator
设计模式之调停者 Mediator
69 1
|
6月前
|
设计模式
设计模式之中介者模式
设计模式之中介者模式
|
7月前
|
设计模式 Go
[设计模式 Go实现] 行为型~中介者模式
[设计模式 Go实现] 行为型~中介者模式
|
7月前
|
设计模式 Java
23种设计模式,中介者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第8天】中介者模式是一种行为设计模式,它通过一个中介对象来封装一系列对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
90 8
|
7月前
|
设计模式 Java
小谈设计模式(26)—中介者模式
小谈设计模式(26)—中介者模式