【中介者模式】设计模式系列:解锁高效协作的秘密武器(设计实战)

news2024/9/20 13:11:55

文章目录

  • 中介者模式在Java中的应用与实践
    • 1. 引言
    • 2. 中介者模式解析
      • 2.1 模式的基本概念
      • 2.2 中介者模式的角色说明
      • 2.3 模式的工作原理
      • 2.4 UML类图和时序图展示
      • 2.5 模式的优点与缺点
      • 2.6 模式的变体和扩展
    • 3. 实现细节
      • 3.1 Java代码示例
      • 3.2 示例应用分析
      • 3.3 代码解释
    • 4. 应用场景
    • 5. 性能考量
      • 5.1 性能影响因素
      • 5.2 中介者模式下的性能优化技巧
      • 5.3 比较中介者模式与其他模式的性能表现
    • 6. 最佳实践
    • 7. 相关设计模式
    • 8. 实战案例
      • 8.1 实战案例一:简单的聊天室应用程序
      • 8.2 实战案例二:桌面应用界面设计
    • 9. 常见问题解答
    • 10. 总结

中介者模式在Java中的应用与实践


根据您的要求,下面是引言和中介者模式解析这两部分的草稿内容。请注意,为了保持内容的连贯性和完整性,这里会包含一些过渡性的语句以及适当的段落连接。


1. 引言

1. 背景介绍

在软件工程中,随着系统功能的增加和复杂度的提高,对象之间的交互也变得越来越频繁。这种交互如果处理不当,会导致对象之间产生紧密的耦合关系,使得系统难以维护和扩展。设计模式作为解决特定问题的模板,在软件设计中扮演着至关重要的角色。其中,中介者模式是一种用于降低对象间通信复杂度的设计模式。

2. 为什么选择中介者模式

中介者模式能够有效地减少对象间的直接依赖,使它们通过一个共享的中介者对象进行通信。这样做的好处在于可以极大地简化对象之间的交互逻辑,并提高系统的可维护性和可扩展性。当一个系统中有多个对象彼此频繁地进行通信时,中介者模式就是一个很好的解决方案。

3. 模式的适用场景

中介者模式适用于以下几种情况:

  • 当一个系统中存在大量对象需要互相通信时;
  • 当对象之间的交互逻辑变得复杂而难以管理时;
  • 当需要通过一个中心化的方式来控制对象间的交互时。

4. 中介者模式的定义和特点

中介者模式定义了一个封装了一系列对象交互的中介对象,用它来降低各对象间的耦合度。中介者对象充当了对象之间的中间人,负责协调和控制对象间的交互。这样,对象就不需要知道彼此的存在,只需要与中介者通信即可。


2. 中介者模式解析

2.1 模式的基本概念

中介者模式的核心思想是通过引入一个中介者对象来集中管理和协调多个对象之间的交互。这有助于降低对象间的耦合度,使得每个对象仅需关注自己的职责,而无需关心与其他对象的直接通信。

2.2 中介者模式的角色说明

中介者模式主要包含以下角色:

1. Mediator(中介者)

  • 定义:定义统一的接口,用来协调各个同事类的行为。
  • 职责:管理各个同事对象之间的交互,并提供一个全局的控制点。

2. ConcreteMediator(具体中介者)

  • 定义:实现了Mediator接口,管理各个具体同事类之间的交互。
  • 职责:实现与各个同事对象交互的方法。

3. Colleague(同事类)

  • 定义:定义同事对象的接口,它只知道自己有一个中介者对象,并不知道其他的同事对象。
  • 职责:实现所有同事对象共有的行为。

4. ConcreteColleague(具体同事类)

  • 定义:实现了Colleague接口,每个具体同事类都只与中介者对象通信,不直接与其他同事类通信。
  • 职责:实现具体的行为逻辑。

2.3 模式的工作原理

中介者模式的工作流程如下:

  1. 各个同事对象通过注册到中介者对象来进行初始化。
  2. 当同事对象发生改变时,它通知中介者对象。
  3. 中介者对象根据需要调用相应的同事对象的方法来触发事件响应。

2.4 UML类图和时序图展示

为了更好地理解中介者模式中的各个角色及其交互,我们可以绘制一个UML类图来展示它们之间的关系。接下来,我们将会生成一张UML类图。下面是中介者模式的UML类图,它展示了各个角色之间的关系以及它们的主要方法:
在这里插入图片描述
如上图所示:

  • Mediator 接口定义了 registerColleaguenotify 方法。
  • ConcreteMediator 实现了 Mediator 接口,并添加了 doSomething 方法来处理具体的行为。
  • Colleague 接口定义了一个抽象的 notify 方法。
  • ConcreteColleague 实现了 Colleague 接口,并添加了 doAction 方法来实现具体的行为逻辑。
    在这里插入图片描述

2.5 模式的优点与缺点

1. 优点

  • 减少对象间的相互依赖:同事对象不需要直接通信,减少了对象间的耦合。
  • 增强了对象的封装性:同事对象只需与中介者通信,不必知道其他同事的存在。
  • 提高了系统的灵活性:新的同事对象可以很容易地加入到系统中,只要它们实现相同的接口。

2. 缺点

  • 中介者对象可能变得庞大复杂:如果系统中的同事对象很多,中介者可能会变得非常复杂,难以管理和维护。
  • 违背开闭原则:当新的同事对象被加入时,可能需要修改中介者对象的代码,这违反了开闭原则。

2.6 模式的变体和扩展

中介者模式可以根据实际需求进行扩展和变体设计,例如:

  • 可以定义多个中介者对象,每个中介者负责一组特定的同事对象。
  • 可以为中介者对象定义不同的策略或行为,从而支持不同的业务逻辑。
  • 可以通过继承和组合的方式创建更复杂的中介者结构。

以下是“实现细节”和“应用场景”这两部分内容的草稿。


3. 实现细节

3.1 Java代码示例

下面是一个简单的Java代码示例,演示如何使用中介者模式来组织对象间的交互。

1. 创建Mediator接口

public interface Mediator {
    void registerColleague(Colleague colleague);
    void notifyColleague(Colleague colleague, String message);
}

2. 实现ConcreteMediator类

import java.util.ArrayList;
import java.util.List;

public class ChatRoomMediator implements Mediator {
    private List<Colleague> colleagues = new ArrayList<>();

    @Override
    public void registerColleague(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void notifyColleague(Colleague sender, String message) {
        for (Colleague colleague : colleagues) {
            if (colleague != sender) {
                colleague.receive(message);
            }
        }
    }
}

3. 定义Colleague接口

public interface Colleague {
    void send(String message);
    void receive(String message);
}

4. 实现多个ConcreteColleague类

User1类

public class User1 implements Colleague {
    private Mediator mediator;

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

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

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

User2类

public class User2 implements Colleague {
    private Mediator mediator;

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

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

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

3.2 示例应用分析

1. 案例背景

假设我们需要构建一个简单的聊天室应用,用户可以在聊天室内发送消息给其他用户。

2. 问题陈述

在没有中介者的情况下,每个用户对象都需要知道其他所有用户的对象引用才能互相发送消息,这会导致对象之间的耦合度过高,难以管理和维护。

3. 解决方案

通过引入一个中介者对象(在这里是ChatRoomMediator),用户对象只需要与中介者通信,而中介者负责转发消息给正确的用户。

3.3 代码解释

1. 如何通过中介者模式解决耦合问题

在这个例子中,User1User2实现了Colleague接口,它们通过send方法向中介者发送消息,并通过receive方法接收消息。由于用户对象仅与中介者通信,而不是直接与其他用户通信,因此对象之间的耦合度大大降低。

2. 类之间的交互方式

  • User1User2对象通过send方法向ChatRoomMediator发送消息。
  • ChatRoomMediator接收到消息后,遍历同事列表并调用每个对象的receive方法,除了发送消息的对象之外的所有对象都会接收到消息。
  • 通过这种方式,对象之间不需要直接了解对方,降低了对象之间的耦合度。

4. 应用场景

1. 多个对象之间频繁交互的例子

在大型应用程序中,比如企业级应用系统,通常有多个子系统需要互相协作完成任务。中介者模式可以用来协调这些子系统之间的通信,降低耦合度。

2. 在GUI开发中的应用

在图形用户界面(GUI)开发中,中介者模式经常被用来管理控件之间的交互。例如,在一个表单中,多个控件(如按钮、文本框等)需要协同工作来完成一个任务。通过中介者模式,可以将控件之间的交互逻辑集中在表单控制器中,使得控件对象更加简单。

3. 在分布式系统中的应用

在分布式系统中,中介者模式可以用来管理不同节点之间的通信。例如,一个消息队列系统可以作为一个中介者,协调各个服务之间的消息传递。

4. 在游戏开发中的应用

在游戏开发中,中介者模式可以用来管理游戏内的多个实体(如玩家、NPC、怪物等)之间的交互。通过一个中介者对象来协调这些实体之间的动作,可以使游戏逻辑更加清晰和易于维护。

5. 其他领域案例研究

  • 金融系统:在交易系统中,中介者模式可以用来协调买卖双方的交易请求,确保交易的安全性和有效性。
  • 智能家居:在智能家居控制系统中,中介者模式可以用来管理各种智能设备(如灯光、空调、窗帘等)之间的交互,简化设备间的通信逻辑。
  • 物流系统:在物流配送系统中,中介者模式可以用来管理仓库、运输车辆和订单处理之间的协调,优化物流流程。

5. 性能考量

5.1 性能影响因素

1. 通信开销

  • 消息传递成本:每次通过中介者传递消息都会产生一定的性能开销,尤其是在高频交互的应用场景中。
  • 网络延迟:在网络环境中,消息从发送到接收可能会经历不同程度的延迟。

2. 中介者负载

  • 并发处理能力:中介者需要处理来自多个同事对象的消息,其并发处理能力会影响整体性能。
  • 资源消耗:中介者对象可能需要占用较多的内存资源来存储同事对象的信息。

3. 同事对象数量

  • 规模增长:随着系统中同事对象数量的增长,中介者需要处理更多的交互,这可能导致性能瓶颈。

5.2 中介者模式下的性能优化技巧

  • 缓存机制:对于重复或不变的数据,可以考虑在中介者中使用缓存机制减少不必要的计算和通信。
  • 异步处理:利用异步编程模型来处理同事对象的请求,以减轻中介者的负担并提高响应速度。
  • 分层架构:在复杂的系统中,可以通过多层中介者来分担负载,每一层负责一部分同事对象的交互。
  • 消息过滤:在中介者中实现消息过滤逻辑,只处理必要的消息,减少无用消息的传递。

5.3 比较中介者模式与其他模式的性能表现

  • 与其他模式比较
    • 命令模式:在某些情况下,如果对象间的交互非常简单且不频繁,使用命令模式可能会比中介者模式更高效。
    • 观察者模式:观察者模式适合于一对多的依赖关系,当变化发生时自动通知所有订阅者。它在消息传递方面可能会比中介者模式更灵活但也会带来额外的性能开销。
    • 策略模式:策略模式适用于算法的封装,不会直接涉及对象间的通信,因此性能差异主要体现在算法执行效率上。

性能考量总结

中介者模式的主要优势在于它能够显著减少对象之间的耦合,使系统的维护和扩展变得更容易。然而,在性能敏感的应用场景中,需要权衡其带来的额外通信开销和其他潜在的性能问题。


6. 最佳实践

1. 使用中介者模式的最佳时机

  • 当对象间存在复杂的交互关系,导致耦合度过高时。
  • 当系统需要一个中心化的控制点来管理多个对象之间的交互时。
  • 当对象间的交互需要被动态地修改或扩展时。

2. 避免过度使用中介者模式

  • 如果对象间的交互比较简单且数量有限,无需使用中介者模式来增加复杂性。
  • 在对象之间不存在明显的一对多关系时,也不适合使用中介者模式。

3. 如何避免中介者对象过于臃肿

  • 职责划分:确保中介者只负责协调同事对象间的交互,而不承担其他业务逻辑。
  • 分解中介者:如果中介者功能过于复杂,可以考虑将其拆分为多个较小的中介者对象,每个中介者负责一部分同事对象的交互。
  • 使用适配器模式:对于不需要频繁交互的同事对象,可以使用适配器模式来简化中介者的职责。

4. 重构建议

  • 定期评估:定期评估中介者的设计是否仍然符合当前的需求。
  • 模块化设计:采用模块化的设计原则,确保系统易于重构和扩展。
  • 性能测试:实施性能测试以确定是否存在性能瓶颈,并据此进行调整。

7. 相关设计模式

1. 与中介者模式相关的其他模式

  • 工厂模式:用于创建中介者和同事对象实例。
  • 装饰器模式:可以用来扩展同事对象的功能,而不改变其接口。
  • 策略模式:可以为中介者定义不同的交互策略。

2. 中介者模式与观察者模式的区别

  • 观察者模式:关注于一个主题对象及其多个观察者之间的依赖关系,当主题状态发生变化时,所有观察者都会被通知。
  • 中介者模式:关注于协调多个对象之间的交互,它不仅限于一个主题的状态变化,而是处理同事对象之间的任何交互。

3. 中介者模式与代理模式的对比

  • 代理模式:为另一个对象提供一个代理以控制对该对象的访问,通常用于远程代理、虚拟代理等场景。
  • 中介者模式:关注的是多个对象之间的交互,而不是单个对象的访问控制。

4. 中介者模式与其他行为型模式的关系

  • 策略模式:可以用来为中介者定义不同的交互策略。
  • 模板方法模式:可以定义中介者的基本框架,让子类来填充具体的实现。
  • 命令模式:可以用来封装中介者和同事对象之间的请求,使其独立于发送者和接收者。

8. 实战案例

8.1 实战案例一:简单的聊天室应用程序

1. 系统架构

  • 客户端:每个用户都是一个客户端,它们通过网络连接到服务器。
  • 服务器:作为中介者,负责接收客户端发送的消息,并将消息转发给其他客户端。

2. 关键代码片段

ServerMediator.java

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

public class ServerMediator implements Mediator {
    private Map<String, User> users = new HashMap<>();

    @Override
    public void registerUser(User user) {
        users.put(user.getName(), user);
    }

    @Override
    public void sendMessage(User sender, String message) {
        for (User user : users.values()) {
            if (!user.equals(sender)) {
                user.receive(message, sender.getName());
            }
        }
    }
}

User.java

public class User implements Colleague {
    private String name;
    private Mediator mediator;

    public User(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
        mediator.registerUser(this);
    }

    @Override
    public void send(String message, String to) {
        System.out.println(name + " sends: " + message + " to " + to);
        mediator.sendMessage(this, message);
    }

    @Override
    public void receive(String message, String from) {
        System.out.println(name + " receives: " + message + " from " + from);
    }

    public String getName() {
        return name;
    }
}

3. 测试与验证

TestChatRoom.java

public class TestChatRoom {
    public static void main(String[] args) {
        Mediator mediator = new ServerMediator();

        User user1 = new User("Alice", mediator);
        User user2 = new User("Bob", mediator);

        user1.send("Hello Bob!", "Bob");
        user2.send("Hi Alice!", "Alice");
    }
}

运行上述测试代码,可以看到用户之间的消息被正确地转发。


8.2 实战案例二:桌面应用界面设计

1. 用户界面元素交互

假设我们有一个简单的桌面应用程序,其中包括几个按钮和一个文本区域,用于显示用户的操作历史记录。

2. 中介者角色定义

  • FormController:作为中介者,它负责处理所有UI元素的事件,并更新显示信息。

FormController.java

public class FormController implements Mediator {
    private Button button1;
    private Button button2;
    private TextArea display;

    public FormController(Button button1, Button button2, TextArea display) {
        this.button1 = button1;
        this.button2 = button2;
        this.display = display;
        button1.setMediator(this);
        button2.setMediator(this);
    }

    @Override
    public void registerColleague(Colleague colleague) {
        // Implementation not needed in this example
    }

    @Override
    public void notifyColleague(Colleague colleague, String message) {
        display.append(message);
    }
}

Button.java

public class Button extends JButton implements Colleague {
    private Mediator mediator;

    public Button(String text, Mediator mediator) {
        super(text);
        this.mediator = mediator;
        addActionListener(e -> mediator.notifyColleague(this, "Button clicked: " + text));
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
}

TextArea.java

public class TextArea extends JTextArea implements Colleague {
    public TextArea() {
        super();
    }

    @Override
    public void append(String message) {
        super.append(message + "\n");
    }

    @Override
    public void setMediator(Mediator mediator) {
        // Not applicable in this case
    }
}

3. 测试与反馈

MainFrame.java

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;

public class MainFrame extends JFrame {
    public MainFrame() {
        setTitle("Form Example");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        FormController controller = new FormController(
                new Button("Button 1", controller),
                new Button("Button 2", controller),
                new TextArea()
        );

        panel.add(controller.getButton1());
        panel.add(controller.getButton2());

        add(panel, BorderLayout.CENTER);
        add(controller.getDisplay(), BorderLayout.SOUTH);

        setVisible(true);
    }

    public static void main(String[] args) {
        new MainFrame();
    }
}

运行上述代码,可以看到一个简单的窗口,其中包含两个按钮和一个文本区域。点击按钮会将相应的消息追加到文本区域中。


9. 常见问题解答

1. 如何识别中介者模式的应用场景?

  • 当系统中有多个对象需要相互作用,并且这些对象之间的交互变得复杂和难以管理时。
  • 当对象之间的交互需要被集中控制,以减少对象间的直接依赖时。
  • 当需要动态地改变对象间的交互逻辑时。

2. 如何确定中介者对象的职责范围?

  • 明确职责:中介者对象应该只负责协调同事对象之间的交互,而不应包含具体的业务逻辑。
  • 边界定义:定义清楚哪些操作应该由中介者处理,哪些操作应该由同事对象自己处理。
  • 可扩展性:考虑未来的扩展需求,确保中介者的设计能够适应新的同事对象加入。

3. 如何平衡中介者对象的大小?

  • 职责分离:将中介者对象的责任分解成更小的职责。
  • 层次结构:如果中介者对象变得过于庞大,可以考虑将其分解成层次结构,每层负责一部分同事对象的交互。
  • 组合使用:与其他设计模式(如观察者模式、策略模式)结合使用,以分散中介者的职责。

10. 总结

1. 主要收获

  • 理解中介者模式的核心概念:通过一个中心化的对象来协调多个对象之间的交互。
  • 学习中介者模式的实现细节:包括接口定义、类实现以及同事对象之间的交互方式。
  • 掌握中介者模式的应用场景:特别是在需要管理复杂对象交互的系统中。
  • 熟悉中介者模式的性能考量和最佳实践:如何优化性能以及何时使用中介者模式。

2. 未来发展方向

  • 微服务架构下的中介者模式:探索中介者模式在微服务架构中的应用,特别是如何管理服务之间的通信。
  • 分布式系统中的中介者模式:研究如何在分布式环境中使用中介者模式来协调服务组件。
  • 中介者模式的动态配置:探讨如何在运行时动态地配置中介者对象,以适应不断变化的系统需求。

本文详细介绍了23种设计模式的基础知识,帮助读者快速掌握设计模式的核心概念,并找到适合实际应用的具体模式:
【设计模式入门】设计模式全解析:23种经典模式介绍与评级指南(设计师必备)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css中使用@property自定义属性,实现闪烁渐变背景【2024新属性】

自 2024 年 7 月起&#xff0c;此功能适用于最新的设备和浏览器版本。此功能可能无法在较旧的设备或浏览器中使用。 property 是 CSS 中一个相对较新的功能&#xff0c;主要用于定义自定义属性&#xff08;即 CSS 变量&#xff09;的类型、继承性以及初始值。它允许开发者更好地…

linux使用nginx部署springboot + vue分离项目

第一步,打包后端项目 maven打包springboot项目为jar文件,上传到服务器,然后运行此jar,具体操作参考: centos部署jar包_centos jar 静态资源文件-CSDN博客 第二步,安装nginx 具体操作自行查找,相关命令: 启动: /usr/local/nginx/sbin/nginx 重新加载配置: /usr…

[数据集][目标检测]木材缺陷检测数据集VOC+YOLO格式2383张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2383 标注数量(xml文件个数)&#xff1a;2383 标注数量(txt文件个数)&#xff1a;2383 标注…

PyQt5基础控件

一、按钮 (一)普通按钮QPushButton 1.创建按钮控件 QPushButton()&#xff1a;创建一个无父控件的按钮控件QPushButton(parent)&#xff1a;创建控件的同时, 设置父控件QPushButton(text, parent)&#xff1a;创建控件的同时, 设置提示文本和父控件QPushButton(icon, text, …

自定义组件上传到maven中央仓库2024实测可用最详细版

自 2024 年 3 月 12 日起&#xff0c;官方调整了发布的方式&#xff0c;所有发布都必须通过中央门户&#xff0c;以往老方式可能不适用&#xff0c;以下记录2024新版上传发布方式 注册sonatype账号 Maven中央仓库并不支持直接发布jar包&#xff0c;sonatype是其指定的第三方仓…

【Python】函数进阶(上)

本篇文章将讲解函数进阶的知识&#xff1a; &#xff08;1&#xff09;函数的补充 &#xff08;2&#xff09;函数名是什么 &#xff08;3&#xff09;返回值和print &#xff08;4&#xff09;函数的作用域 1、函数的补充 &#xff08;1&#xff09;参数内存地址相关 如何查…

【算法专题】滑动窗口类

个人主页&#xff1a;CSDN_小八哥向前冲~ 所属专栏&#xff1a;算法基础入门 目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 水果成篮 找到字符串中所有字母异位词 最小覆盖字串 长度最小的子数组 题目&#xff1a;【LeetCode】长度…

Python生成432Hz音频

使用 numpy 来生成信号&#xff0c; 使用 matplotlib 可视化信号&#xff0c; 使用 sounddevice 播放声音。 以下生成和播放 432 Hz 的正弦波信号&#xff1a; import numpy as np import sounddevice as sd import matplotlib.pyplot as plt# 生成单音函数 def generate_to…

订单完工数量超过了最大可完工数量

本次完工将造成订单YWS-24070027产出实际完工数量达到了6093.000000000&#xff0c;超过了最大可完工数量5000.000000000 一个成品入库单被它们玩坏了。生产不知道生产了什么。PMC不知道要入库什么。鸡同鸭天天开会之后结果就是单据重复的开立&#xff0c;删除&#xff0c;开立…

C++ TinyWebServer项目总结(5. Linux网络编程基础API)

还是给我的语雀文档打个广告&#xff1a; 《5. C TinyWebServer项目总结&#xff08;5. Linux网络编程基础API&#xff09;》我的文章都是先在语雀里记录的&#xff0c;然后再同步发送到CSDN上&#xff0c;有些格式问题实在是懒得改了&#xff0c;可能会导致大家看的不舒服&…

自行车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化

在当今这个日新月异的数字化时代&#xff0c;制造业正经历着前所未有的变革&#xff0c;自行车制造5G智能工厂工业物联数字孪生平台的兴起&#xff0c;无疑是这场转型浪潮中一股强劲力量。自行车制造5G智能工厂工业物联数字孪生平台的成功应用&#xff0c;不仅仅是技术上的突破…

代码随想录DAY21 - 二叉树 - 08/20

目录 修建二叉搜索树 题干 思路和代码 递归法 迭代法 将有序数组转化为平衡二叉搜索树 题干 思路和代码 递归法 递归优化 迭代法 把二叉搜索树转换为累加树 题干 思路和代码 递归法 迭代法 修建二叉搜索树 题干 题目&#xff1a;给你二叉搜索树的根节点 root …

数据结构【顺序结构二叉树:堆】(1)

​​​​​​​ &#x1f31f;个人主页&#xff1a;落叶 目录 ​ &#x1f525;树的概念与结构​​​​​​​ &#x1f525;树的表⽰ &#x1f525;孩⼦兄弟表⽰法&#xff1a; &#x1f525;树形结构实际运⽤场景 &#x1f525;⼆叉树 &#x1f525;概念与结构 &…

day4JS-数组

1. 什么是数组 数组是值的有序集合。每个值叫做一个元素。每个元素在数组中有一个位置, 以数字表示,称为索引 (有时也称为下标)。数组的元素可以是任何类型。数组索引从 0 开始,数组最大能容纳 4294967295 个元素。 2. 数组的声明与使用 2.1 使用字面量的方式声明数组 语法…

Minio web控制台实现授权管理

启动minio ./minio server /data01/aidacp/apps/minio/data --config-dir /data01/aidacp/apps/minio/conf --address 127.0.0.1:19090 --console-address 127.0.0.1:19091 &WARNING: Detected Linux kernel version older than 4.0.0 release, there are some known pote…

建设项目跟踪与展示系统

这是在翻旧文件时翻到的16年写的一个项目 建设项目跟踪与展示系统 建设方案 一、系统建设目的及意义 建设工程项目进度控制的最终目的是确保建设项目按预定的时间完成。能否在预定的时间内交付使用&#xff0c;直接影响到投资效益。为解决施工组织过程中存在问题&#xff0c;…

PyTorch深度学习实战(25)—— 使用向量化思想解决实际问题

本文将实际应用向量化思想解决深度学习中的几个经典问题,读者可以在这些示例中进一步领悟向量化思想和高级索引思想。 1. Box_IoU Box_IoU是目标检测任务中最基本的评价指标。简单来说,Box_IoU就是模型预测的检测结果框(predicted bbox)与原始标记框(ground truth)之间的…

企业级Nginx源码安装及其实战讲解

一&#xff1a;web服务基础介绍 1.1Web服务介绍 Apache 经典的 Web 服务端 Apache起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是1.X和2.X 其可以通过编译安装实现特定的功能 Apache prefork 模型 预派生模式&#xff0c;有一个…

[C++进阶]map和set

一、关联式容器 STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。 那什么是关联式容器&#xff1f;它与序列式容器…

2.复杂度分析

2.1 算法效率评估 在算法设计中&#xff0c;我们先后追求以下两个层面的目标。 找到问题解法&#xff1a;算法需要在规定的输入范围内可靠地求得问题的正确解。寻求最优解法&#xff1a;同一个问题可能存在多种解法&#xff0c;我们希望找到尽可能高效的算法。 也就是说&a…