Java中23种面试常考的设计模式之中介者模式(Mediator)---行为型模式

简介: Java中23种面试常考的设计模式之中介者模式(Mediator)---行为型模式

【Java中23种面试常考的设计模式之中介者模式(Mediator)---行为型模式】

知识回顾:
>

之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)---行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)---行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)---行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)---行为型模式】
【Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式】
【Java中23种面试常考的设计模式之迭代器模式(Iterator)---行为型模式】
【Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之中介者模式(Mediator)---行为型模式】。

中介者模式

中介者模式:用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

解决的问题

  1. 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂。
  2. 因为对象之前存在着复杂的关系,牵一发而动全身,所以我们需要抽离出来一个中介者类来对其它类进行灵活的调节。
  3. 如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些对象称为"同事对象",我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为星型结构。

生产开发中常用的使用场景

  1. MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

中介者模式优点与缺点

优点

  1. 降低了类的复杂度,将一对多转化成了一对一。
  2. 各个类之间的解耦。
  3. 符合迪米特原则。

缺点

  1. 中介者会庞大,变得复杂难以维护。

核心角色

Mediator 中介者接口、ConcreteMediator 中介者实现、Colleague同事类接口、ConcreteColleague同事实现类、客户端测试。

UML类图

image.png

实现代码

我们实现这样一个栗子:假设A、B、C同事分别负责不同的开发任务,如果没人领导他们,或者说没人给他们分发任务,他们在开发中就会存在一些冲突,这就需要一个中介者(领导者)对他们进行协调。

Mediator 中介者接口

package com.mediator;

public interface Mediator {
   
   

    void register(String cname,Colleague colleague);

    void command(String cname);
}

ConcreteMediator 中介者实现

package com.mediator;

import java.util.HashMap;
import java.util.Map;

public class ConcreteMediator  implements Mediator {
   
   

    private Map<String,Colleague> map = new HashMap<String , Colleague>();

    @Override
    public void command(String cname) {
   
   
        map.get(cname).develop();
    }

    @Override
    public void register(String cname, Colleague colleague) {
   
   
        map.put(cname, colleague);
    }
}

Colleague同事类接口

package com.mediator;

public interface Colleague {
   
   
    void develop(); //做自己负责的功能模块
    void report();  //向项目领导者汇报工作
}

ConcreteColleagueA同事实现类

package com.mediator;

public class ConcreteColleagueA implements Colleague {
   
   

    private Mediator m;  //持有中介者的引用

    public ConcreteColleagueA(Mediator m) {
   
   
        super();
        this.m = m;
        m.register("A", this);
    }

    @Override
    public void report() {
   
   
        System.out.println("我是A!我要汇报工作!");
        m.command("A");
    }

    @Override
    public void develop() {
   
   
        System.out.println("我是A,我负责前端功能开发!");
    }
}

ConcreteColleagueB同事实现类

package com.mediator;

public class ConcreteColleagueB implements Colleague {
   
   

    private Mediator m;  //持有中介者引用

    public ConcreteColleagueB(Mediator m) {
   
   
        super();
        this.m = m;
        m.register("B", this);
    }

    @Override
    public void report() {
   
   
        System.out.println("我是B!我要汇报工作!");
        m.command("B");

    }

    @Override
    public void develop() {
   
   
        System.out.println("我是B,我负责后端功能开发!");
    }
}

ConcreteColleagueC同事实现类

package com.mediator;

public class ConcreteColleagueC implements Colleague {
   
   

    private Mediator m;  //持有中介者的引用

    public ConcreteColleagueC(Mediator m) {
   
   
        super();
        this.m = m;
        m.register("C", this);
    }

    @Override
    public void report() {
   
   
        System.out.println("我是C!我要汇报工作!");
        m.command("C");
    }

    @Override
    public void develop() {
   
   
        System.out.println("我是C,我负责数据库设计!");
    }
}

客户端测试代码Client-Main

package com.mediator;

public class Main {
   
   
    public static void main(String[] args) {
   
   
        // 获取中介者对象
        Mediator m = new ConcreteMediator();
        // 获取同事对象,实例化的时候会在中介者对象中注册
        ConcreteColleagueA   colleagueA = new ConcreteColleagueA(m);
        ConcreteColleagueB   colleagueB = new ConcreteColleagueB(m);
        ConcreteColleagueC   colleagueC = new ConcreteColleagueC(m);


        colleagueA.report();

        colleagueB.report();

        colleagueC.report();
    }

}

运行结果展示:

image.png

好了,到这里【Java中23种面试常考的设计模式之中介者模式(Mediator)---行为型模式】就结束了,23种设计模式持续更新汇总中。

相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
86 2
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
83 14
|
2月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
2月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
37 6
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
40 4
|
2月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
76 4
|
2月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
5月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。