23种设计模式,中介者模式的概念优缺点以及JAVA代码举例

简介: 【4月更文挑战第8天】中介者模式是一种行为设计模式,它通过一个中介对象来封装一系列对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介者模式(Mediator Pattern)

中介者模式是一种行为设计模式,它通过一个中介对象来封装一系列对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

概念

  • 中介者(Mediator):定义一个接口用于与各同事(Colleague)对象通信。
  • 具体中介者(Concrete Mediator):实现中介者的接口,并协调同事对象之间的交互关系。
  • 同事类(Colleague):与其他同事对象通信时,只与中介者对象交互,而不是直接与其他同事类交互。

优点

  1. 减少类间的依赖关系:将多个类之间的通信封装到一个类中,多个类相互之间的关系变得更加简单。
  2. 集中控制交互:集中控制交互复杂性,中介者负责协调各同事之间的交互,使各同事类更易于管理和维护。
  3. 提高可复用性:将对象的行为方式封装在它们的互动中,从而使得它们更容易被独立地复用。

缺点

  1. 中介者可能过于复杂:如果设计不当,中介者对象本身变得过于复杂,这反而会使整个系统更难理解和维护。
  2. 过度集中化:随着逻辑的增加,中介者可能演变成一个巨大的类,集中过多的责任,使得系统扩展和维护复杂化。

Java代码示例

假设我们有一个简单的聊天室,其中的用户互相发送消息,使用中介者模式来简化用户之间的通信。

java复制代码

// 中介者接口
interface Mediator {
    void send(String message, Colleague colleague);
}

// 具体中介者
class ChatMediator implements Mediator {
    private List<Colleague> colleagues;

    public ChatMediator() {
        this.colleagues = new ArrayList<>();
    }

    public void addColleague(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void send(String message, Colleague colleague) {
        for (Colleague c : colleagues) {
            // Don't tell the user about their own message
            if (c != colleague) {
                c.receive(message);
            }
        }
    }
}

// 同事抽象类
abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}

// 具体同事类
class User extends Colleague {
    public User(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String message) {
        System.out.println("User Sending: " + message);
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("User Received: " + message);
    }
}

// 客户端代码
public class MediatorDemo {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatMediator();
        User user1 = new User(mediator);
        User user2 = new User(mediator);
        mediator.addColleague(user1);
        mediator.addColleague(user2);

        user1.send("Hi there!");
        user2.send("Hello!");
    }
}

在这个例子中,ChatMediator 作为中介者,负责传递消息。每个 User 实例是一个同事类,它们通过中介者与其他用户通信。这样,用户之间不直接相互通信,而是通过中介者来进行,这样可以很容易地添加更多的用户或修改通信逻辑。

相关文章
|
4天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
26 7
|
4天前
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
10 1
|
4天前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
19 1
|
4天前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
16 2
|
1天前
|
Java 程序员 API
Java 8 Lambda 表达式和Stream API:概念、优势和实战应用
【5月更文挑战第20天】在Java 8中,Lambda 表达式和Stream API是两个非常强大的特性,它们显著改变了Java程序员处理数据和编写代码的方式。本篇技术文章将深入探讨这些特性的概念、优点,并提供实战示例,帮助理解如何有效地利用这些工具来编写更简洁、更高效的代码。
18 6
|
1天前
|
安全 Java
Java中的多线程编程:概念、实现及性能优化
【5月更文挑战第20天】在计算机科学中,多线程是一种允许程序同时执行多个任务的技术。Java作为一种广泛使用的编程语言,提供了对多线程编程的支持。本文将介绍Java中多线程的基本概念、实现方法以及性能优化策略,帮助读者更好地理解和应用多线程技术。
|
2天前
|
Java 测试技术
如何提高Java代码的可读性
Java是一种常用的编程语言,但是写出易懂且可读性高的代码却是一项挑战。本文将分享一些技巧和建议,帮助您提高Java代码的可读性和可维护性。
|
4天前
|
设计模式 Java
Java一分钟之-设计模式:观察者模式与事件驱动
【5月更文挑战第17天】本文探讨了Java中实现组件间通信的观察者模式和事件驱动编程。观察者模式提供订阅机制,当对象状态改变时通知所有依赖对象。然而,它可能引发性能问题、循环依赖和内存泄漏。代码示例展示了如何实现和避免这些问题。事件驱动编程则响应用户输入和系统事件,但回调地狱和同步/异步混淆可能造成困扰。JavaFX事件驱动示例解释了如何处理事件。理解这两种模式有助于编写健壮的程序。
10 1
|
6天前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
257 1
|
Java BI API
在Java代码中打日志需要注意什么?
日志是什么?日志是你在代码运行时打印出来的一些数据和记录,是快速排查问题的好帮手,是撕逼和甩锅的利器!
333 0