设计模式之中介者模式

中介者模式是一种行为设计模式,用于减少对象间的直接依赖,降低通信复杂性。在飞机降落的例子中,塔台作为中介者协调各飞机的降落顺序。此模式适用于对象间关系复杂、需解耦的情况。代码示例展示了如何创建一个婚介所中介者,协调会员之间的匹配。中介者模式虽简化交互,但也可能导致中介者自身过于复杂,可能需要结合其他模式解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中介者模式

菜鸟教程 - 中介者模式

五分钟设计模式 - 22中介者模式

尚硅谷

介绍

中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系,降低多个对象和类之间的通信复杂性

该模式限制对象之间的直接依赖和交互,而是让他们与一个中介者对象进行合作。

它将一个对象从决策者转变为参与者,将决策权交予中介者统一管理

它会将一个网状依赖结构变为星型结构

飞机降落时,各个飞机之间不直接相互沟通确定降落顺序,而是通过塔台安排降落顺序

使用场景:

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

中介者模式简化了对象交互(依赖),将参与者解耦,符合迪米特法则。

对于复杂的对象之间的交互,可以引入中介者,简化各个类的依赖关系

中介者承担了较多责任,容易变得较为复杂,且不稳定。如新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,可以搭配其他设计模式(观察者模式和状态模式)来解决这个问题。


原理和角色

下图中,中介者负责协调Component对象之间的关系,Component也通常被称为Colleague(同事类)

在这里插入图片描述


代码示例:(来自五分钟设计模式 - 22中介者模式)

public class MediatorPattern {
    public static void main(String[] args) {
        // 1. 定义中介者
        MarriageMediator mediator = new MarriageMediatorImpl();

        Person p1 = new Person("小明", 18, true, 18, mediator);

        Person p2 = new Person("小红", 25, false, 18, mediator);
        Person p3 = new Person("小兰", 18, false, 18, mediator);
        // 2. 将需要交互的对象添加到中介者中
        mediator.register(p1);
        mediator.register(p2);
        mediator.register(p3);

        // 3. 由中介者负责与多个对象沟通
        mediator.pair(p1);
    }
}

/** 婚介所 */
interface MarriageMediator {
    /** 注册会员 */
    void register(Person person);

    /** 相亲。在这里,由中介者负责与多个对象进行交互 */
    void pair(Person person);
}

class Person {
    String name;
    int age;
    boolean sex;
    int requestAge;
    // 中介
    MarriageMediator mediator;

    // 要求传入中介类对象
    public Person(String name, int age, boolean sex, 
                  int requestAge, MarriageMediator mediator) {...}

    // 相亲
    public void findPartner() {
        // 让婚介所为自己寻找伴侣(让中介类负责与其他对象进行交互)
        mediator.pair(this);
    }
}

class MarriageMediatorImpl implements MarriageMediator {
    /** 保存需要交互的对象 */
    List<Person> members = new ArrayList<>();

    @Override
    public void register(Person person) {
        members.add(person);
    }

    @Override
    public void pair(Person requestPerson) {
        /*
        由中介者负责与多个对象进行交互
         */
        for (Person member : members) {
            // 判断相亲是否成功
            if (member.age == requestPerson.requestAge && member.sex != requestPerson.sex) {
                System.out.println("将 " + requestPerson.name + " 与 " + member.name + " 送入洞房!");
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值