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种设计模式持续更新汇总中。

相关文章
|
20天前
|
设计模式 算法 Java
Java中的设计模式:提升代码质量的秘诀
【8月更文挑战第23天】在Java开发中,设计模式是提高代码可读性、可维护性和扩展性的强有力工具。本文通过浅显易懂的语言和实际案例,探讨几种常见的设计模式及其在Java中的应用,旨在帮助开发者更好地理解并运用这些模式来优化自己的代码结构。
37 2
|
13天前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
30 2
|
13天前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
26 1
|
13天前
|
设计模式 Java
重构你的代码:探索Java中的混合、装饰器与组合设计模式
【8月更文挑战第30天】在软件开发中,设计模式为特定问题提供了结构化的解决方案,使代码更易理解、维护及扩展。本文将介绍三种常用的 Java 设计模式:混合模式、装饰器模式与组合模式,并附有示例代码展示实际应用。混合模式允许通过继承多个接口或抽象类实现多重继承;装饰器模式可在不改变对象结构的情况下动态添加新功能;组合模式则通过树形结构表示部分-整体层次,确保客户端处理单个对象与组合对象时具有一致性。
11 1
|
21天前
|
消息中间件 缓存 算法
Java多线程面试题总结(上)
进程和线程是操作系统管理程序执行的基本单位,二者有明显区别: 1. **定义与基本单位**:进程是资源分配的基本单位,拥有独立的内存空间;线程是调度和执行的基本单位,共享所属进程的资源。 2. **独立性与资源共享**:进程间相互独立,通信需显式机制;线程共享进程资源,通信更直接快捷。 3. **管理与调度**:进程管理复杂,线程管理更灵活。 4. **并发与并行**:进程并发执行,提高资源利用率;线程不仅并发还能并行执行,提升执行效率。 5. **健壮性**:进程更健壮,一个进程崩溃不影响其他进程;线程崩溃可能导致整个进程崩溃。
26 2
|
21天前
|
存储 Java
Java面向对象面试题总结(上)
在Java中,重写(Override)与重载(Overload)是两个重要的概念,关联到方法的定义与调用。重写是指子类对继承自父类的方法进行新的实现,以便提供子类特有的行为,其关键在于方法签名一致但方法体不同。重载则允许在同一个类中定义多个同名方法,只要参数列表不同即可,以此提供方法调用的灵活性。重写关注多态性,而重载强调编译时多态。
17 1
|
22天前
|
NoSQL Java 数据库
2022年整理最详细的java面试题、掌握这一套八股文、面试基础不成问题[吐血整理、纯手撸]
这篇文章是一份详尽的Java面试题总结,涵盖了从面向对象基础到分布式系统设计的多个知识点,适合用来准备Java技术面试。
2022年整理最详细的java面试题、掌握这一套八股文、面试基础不成问题[吐血整理、纯手撸]
|
11天前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
49 0
|
18天前
|
设计模式 缓存 算法
探索 Java 设计模式及其重要性
【8月更文挑战第24天】
41 0
|
18天前
|
Java 编译器 开发工具
JDK vs JRE:面试大揭秘,一文让你彻底解锁Java开发和运行的秘密!
【8月更文挑战第24天】JDK(Java Development Kit)与JRE(Java Runtime Environment)是Java环境中两个核心概念。JDK作为开发工具包,不仅包含JRE,还提供编译器等开发工具,支持Java程序的开发与编译;而JRE仅包含运行Java程序所需的组件如JVM和核心类库。一个简单的&quot;Hello, World!&quot;示例展示了两者用途:需借助JDK编译程序,再利用JRE或JDK中的运行环境执行。因此,开发者应基于实际需求选择安装JDK或JRE。
37 0