计算机编程中的设计模式及其在简化复杂系统设计中的应用

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

计算机编程中的设计模式及其在简化复杂系统设计中的应用

计算机编程中的设计模式及其在简化复杂系统设计中的应用

  • 计算机编程中的设计模式及其在简化复杂系统设计中的应用
    • 引言
    • 设计模式概述
      • 什么是设计模式
      • 设计模式的优势
      • 设计模式的分类
    • 创建型模式
      • 1. 单例模式(Singleton Pattern)
      • 2. 工厂方法模式(Factory Method Pattern)
      • 3. 抽象工厂模式(Abstract Factory Pattern)
    • 结构型模式
      • 1. 适配器模式(Adapter Pattern)
      • 2. 装饰器模式(Decorator Pattern)
      • 3. 代理模式(Proxy Pattern)
    • 行为型模式
      • 1. 观察者模式(Observer Pattern)
      • 2. 策略模式(Strategy Pattern)
      • 3. 命令模式(Command Pattern)
    • 设计模式在简化复杂系统设计中的应用
      • 1. 提高代码的可维护性和可扩展性
      • 2. 降低系统的耦合度
      • 3. 提高代码的重用性
      • 4. 促进团队协作
      • 5. 解决复杂的设计问题
    • 实际案例:使用设计模式简化一个电子商务系统的开发
      • 1. 使用单例模式管理数据库连接
      • 2. 使用工厂方法模式创建订单
      • 3. 使用适配器模式集成第三方支付系统
      • 4. 使用观察者模式处理订单状态变化
      • 5. 使用策略模式处理不同的支付方式
    • 结论
    • 参考资料

引言

设计模式是在软件设计过程中总结出来的一些通用解决方案,旨在解决常见的设计问题。通过使用设计模式,可以简化复杂系统的开发,提高代码的可维护性和可扩展性。本文将详细介绍设计模式的基本概念、分类、实现方式以及在简化复杂系统设计中的应用。

设计模式概述

什么是设计模式

设计模式是在软件设计过程中总结出来的一些通用解决方案,旨在解决常见的设计问题。设计模式不是具体的代码,而是解决问题的一种模板或蓝图。

设计模式的优势

  1. 重用性:设计模式提供了解决常见问题的通用方法,可以重复使用。
  2. 可维护性:使用设计模式可以使代码结构更加清晰,易于维护。
  3. 可扩展性:设计模式可以提高系统的可扩展性,便于未来的修改和扩展。
  4. 团队协作:设计模式提供了一种共同的语言,便于团队成员之间的沟通和协作。

设计模式的分类

设计模式通常分为三类:

  1. 创建型模式:关注对象的创建过程,提供了一种创建对象的最佳方式。
  2. 结构型模式:关注类或对象的组合,提供了一种将类或对象组合成更大的结构的方法。
  3. 行为型模式:关注对象之间的职责分配,提供了一种定义对象之间交互的方式。

创建型模式

1. 单例模式(Singleton Pattern)

单例模式确保一个类只有一个实例,并提供一个全局访问点。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

2. 工厂方法模式(Factory Method Pattern)

工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。

public abstract class Creator {
    public abstract Product factoryMethod();

    public void doSomething() {
        Product product = factoryMethod();
        product.use();
    }
}

public class ConcreteCreator extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProduct();
    }
}

public interface Product {
    void use();
}

public class ConcreteProduct implements Product {
    @Override
    public void use() {
        System.out.println("Using ConcreteProduct");
    }
}

3. 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式提供了一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。

public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

public class ConcreteFactory1 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB1();
    }
}

public class ConcreteFactory2 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB2();
    }
}

public interface ProductA {
    void useA();
}

public interface ProductB {
    void useB();
}

public class ConcreteProductA1 implements ProductA {
    @Override
    public void useA() {
        System.out.println("Using ConcreteProductA1");
    }
}

public class ConcreteProductB1 implements ProductB {
    @Override
    public void useB() {
        System.out.println("Using ConcreteProductB1");
    }
}

public class ConcreteProductA2 implements ProductA {
    @Override
    public void useA() {
        System.out.println("Using ConcreteProductA2");
    }
}

public class ConcreteProductB2 implements ProductB {
    @Override
    public void useB() {
        System.out.println("Using ConcreteProductB2");
    }
}

结构型模式

1. 适配器模式(Adapter Pattern)

适配器模式将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

public interface Target {
    void request();
}

public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific Request");
    }
}

public class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        target.request();
    }
}

2. 装饰器模式(Decorator Pattern)

装饰器模式允许向一个对象动态地添加功能,而不影响该对象所属类的其他对象。

public interface Component {
    void operation();
}

public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("ConcreteComponent Operation");
    }
}

public abstract class Decorator implements Component {
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        component.operation();
    }
}

public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        addedBehavior();
    }

    private void addedBehavior() {
        System.out.println("Added Behavior A");
    }
}

public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        addedBehavior();
    }

    private void addedBehavior() {
        System.out.println("Added Behavior B");
    }
}

public class Client {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        Component decoratedA = new ConcreteDecoratorA(component);
        Component decoratedB = new ConcreteDecoratorB(decoratedA);
        decoratedB.operation();
    }
}

3. 代理模式(Proxy Pattern)

代理模式为其他对象提供一种代理以控制对这个对象的访问。

public interface Subject {
    void request();
}

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject Request");
    }
}

public class Proxy implements Subject {
    private RealSubject realSubject;

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.request();
        postRequest();
    }

    private void preRequest() {
        System.out.println("Pre Request");
    }

    private void postRequest() {
        System.out.println("Post Request");
    }
}

public class Client {
    public static void main(String[] args) {
        Subject proxy = new Proxy();
        proxy.request();
    }
}

行为型模式

1. 观察者模式(Observer Pattern)

观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

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

public interface Observer {
    void update(String message);
}

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String message);
}

public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

public class ConcreteObserver implements Observer {
    @Override
    public void update(String message) {
        System.out.println("Received: " + message);
    }
}

public class Client {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver();
        Observer observer2 = new ConcreteObserver();

        subject.registerObserver(observer1);
        subject.registerObserver(observer2);

        subject.notifyObservers("Hello Observers");
    }
}

2. 策略模式(Strategy Pattern)

策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。

public interface Strategy {
    void execute();
}

public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy A");
    }
}

public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy B");
    }
}

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();
    }
}

public class Client {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStrategyA());
        context.executeStrategy();

        context.setStrategy(new ConcreteStrategyB());
        context.executeStrategy();
    }
}

3. 命令模式(Command Pattern)

命令模式将请求封装成对象,从而使不同的请求可以有不同的参数,也可以将请求排队。命令模式支持可撤销的操作。

public interface Command {
    void execute();
}

public class Receiver {
    public void action() {
        System.out.println("Receiver Action");
    }
}

public class ConcreteCommand implements Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.action();
    }
}

public class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void invoke() {
        command.execute();
    }
}

public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        invoker.invoke();
    }
}

图示:设计模式的基本概念和分类

设计模式在简化复杂系统设计中的应用

1. 提高代码的可维护性和可扩展性

设计模式提供了一种结构化的方式来组织代码,使得代码更加模块化和易于维护。通过使用设计模式,可以更容易地进行代码的扩展和修改。

2. 降低系统的耦合度

设计模式通过抽象和封装,降低了系统各部分之间的耦合度,使得系统更加灵活和可复用。

3. 提高代码的重用性

设计模式提供了解决常见问题的通用方法,可以重复使用这些方法,减少重复代码的编写。

4. 促进团队协作

设计模式提供了一种共同的语言,便于团队成员之间的沟通和协作。通过使用设计模式,团队成员可以更快地理解彼此的代码。

5. 解决复杂的设计问题

设计模式提供了一种系统化的方法来解决复杂的设计问题,使得开发人员可以更专注于业务逻辑的实现。

图示:使用设计模式简化一个电子商务系统的开发的具体步骤

实际案例:使用设计模式简化一个电子商务系统的开发

假设我们正在开发一个电子商务系统,需要处理用户订单、支付和物流等复杂功能。以下是具体的步骤和代码示例:

1. 使用单例模式管理数据库连接

使用单例模式确保数据库连接只有一个实例,提高性能和资源利用率。

public class DatabaseConnection {
    private static DatabaseConnection instance;
    private Connection connection;

    private DatabaseConnection() {
        // 初始化数据库连接
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ecommerce", "user", "password");
    }

    public static DatabaseConnection getInstance() {
        if (instance == null) {
            synchronized (DatabaseConnection.class) {
                if (instance == null) {
                    instance = new DatabaseConnection();
                }
            }
        }
        return instance;
    }

    public Connection getConnection() {
        return connection;
    }
}

2. 使用工厂方法模式创建订单

使用工厂方法模式创建不同类型的订单,提高代码的可扩展性。

public abstract class OrderFactory {
    public abstract Order createOrder();
}

public class DomesticOrderFactory extends OrderFactory {
    @Override
    public Order createOrder() {
        return new DomesticOrder();
    }
}

public class InternationalOrderFactory extends OrderFactory {
    @Override
    public Order createOrder() {
        return new InternationalOrder();
    }
}

public interface Order {
    void placeOrder();
}

public class DomesticOrder implements Order {
    @Override
    public void placeOrder() {
        System.out.println("Placing domestic order");
    }
}

public class InternationalOrder implements Order {
    @Override
    public void placeOrder() {
        System.out.println("Placing international order");
    }
}

public class Client {
    public static void main(String[] args) {
        OrderFactory factory = new DomesticOrderFactory();
        Order order = factory.createOrder();
        order.placeOrder();
    }
}

3. 使用适配器模式集成第三方支付系统

使用适配器模式将第三方支付系统的接口适配到系统的支付接口,提高系统的灵活性。

public interface PaymentGateway {
    void processPayment(double amount);
}

public class ThirdPartyPaymentSystem {
    public void makePayment(double amount) {
        System.out.println("Processing payment of $" + amount + " via third-party system");
    }
}

public class PaymentAdapter implements PaymentGateway {
    private ThirdPartyPaymentSystem thirdPartyPaymentSystem;

    public PaymentAdapter(ThirdPartyPaymentSystem thirdPartyPaymentSystem) {
        this.thirdPartyPaymentSystem = thirdPartyPaymentSystem;
    }

    @Override
    public void processPayment(double amount) {
        thirdPartyPaymentSystem.makePayment(amount);
    }
}

public class Client {
    public static void main(String[] args) {
        ThirdPartyPaymentSystem thirdPartyPaymentSystem = new ThirdPartyPaymentSystem();
        PaymentGateway paymentGateway = new PaymentAdapter(thirdPartyPaymentSystem);
        paymentGateway.processPayment(100.0);
    }
}

4. 使用观察者模式处理订单状态变化

使用观察者模式监听订单状态的变化,并通知相关的组件进行相应的处理。

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

public interface OrderStatusObserver {
    void onOrderStatusChanged(Order order);
}

public interface OrderStatusSubject {
    void registerObserver(OrderStatusObserver observer);
    void removeObserver(OrderStatusObserver observer);
    void notifyObservers(Order order);
}

public class Order implements OrderStatusSubject {
    private List<OrderStatusObserver> observers = new ArrayList<>();
    private String status;

    @Override
    public void registerObserver(OrderStatusObserver observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(OrderStatusObserver observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(Order order) {
        for (OrderStatusObserver observer : observers) {
            observer.onOrderStatusChanged(order);
        }
    }

    public void setStatus(String status) {
        this.status = status;
        notifyObservers(this);
    }
}

public class OrderStatusLogger implements OrderStatusObserver {
    @Override
    public void onOrderStatusChanged(Order order) {
        System.out.println("Order status changed to: " + order.getStatus());
    }
}

public class Client {
    public static void main(String[] args) {
        Order order = new Order();
        OrderStatusObserver logger = new OrderStatusLogger();
        order.registerObserver(logger);

        order.setStatus("Processing");
        order.setStatus("Shipped");
    }
}

5. 使用策略模式处理不同的支付方式

使用策略模式根据不同的支付方式选择不同的支付策略,提高系统的灵活性。

public interface PaymentStrategy {
    void pay(double amount);
}

public class CreditCardStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("Paying $" + amount + " using credit card");
    }
}

public class PayPalStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("Paying $" + amount + " using PayPal");
    }
}

public class PaymentContext {
    private PaymentStrategy strategy;

    public PaymentContext(PaymentStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }

    public void processPayment(double amount) {
        strategy.pay(amount);
    }
}

public class Client {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext(new CreditCardStrategy());
        context.processPayment(100.0);

        context.setStrategy(new PayPalStrategy());
        context.processPayment(200.0);
    }
}

结论

设计模式是在软件设计过程中总结出来的一些通用解决方案,旨在解决常见的设计问题。通过使用设计模式,可以简化复杂系统的开发,提高代码的可维护性和可扩展性。本文详细介绍了设计模式的基本概念、分类、实现方式以及在简化复杂系统设计中的应用,并通过一个实际案例展示了如何使用设计模式简化一个电子商务系统的开发。尽管设计模式面临一些挑战,但随着技术的不断进步,设计模式在现代软件开发中的应用将越来越广泛。

参考资料

  • Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides
  • Head First Design Patterns by Eric Freeman and Elisabeth Robson
  • Refactoring to Patterns by Joshua Kerievsky
  • Design Patterns in Modern JavaScript by Adam Boduch
  • Gang of Four (GoF) Design Patterns

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Tealscale + Headscale + 自建服务器】异地组网笔记

文章目录 效果为什么要用 Headscale云服务器安装 Headscale配置 config.yaml创建反向代理搭建管理 UI授权管理 UI添加互联设备参考 效果 首先是连接情况&#xff0c;双端都连接上自建的 Headscale&#xff0c; 手机使用移动流量&#xff0c;测试一下 ping 值 再试试进入游戏 可…

单片机学习笔记 2. LED灯闪烁

目录 0、实现的功能 1、Keil工程 2、代码实现 0、实现的功能 LED灯闪烁 1、Keil工程 闪烁原理&#xff1a;需要进行软件延时达到人眼能分辨出来的效果。常用的延时方法有软件延时和定时器延时。此次先进行软件延时 具体操作步骤和之前的笔记一致。此次主要利用无符号整型的范…

【Cesium】自定义材质,添加带有方向的滚动路线

【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f356; 前言&#x1f3b6;一、实现过程✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f3b6;一、…

Vue之插槽(slot)

插槽是vue中的一个非常强大且灵活的功能&#xff0c;在写组件时&#xff0c;可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽&#xff0c;可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类&#xff1a;默认插槽&#xff0c;具名插槽和作用域插槽。 下面…

从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南

引言 在深度学习的领域&#xff0c;全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程&#xff0c;理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶&#xff0c;详细剖析这三个主题&#xff0c;帮助你从小白成长为能够解决实际…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

【C++】vector 类模拟实现:探索动态数组的奥秘

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 如果你对string&#xff0c;vector还存在疑惑&#xff0c;欢迎阅读我之前的作品 &#xff1a; 之前文章&#x1f525;&#x1f52…

【ubuntu18.04】vm虚拟机复制粘贴键不能用-最后无奈换版本

我是ubuntu16版本的 之前费老大劲安装的vmware tools结果不能用 我又卸载掉&#xff0c;安装了open-vm-tools 首先删除VMware tools sudo vmware-uninstall-tools.pl sudo rm -rf /usr/lib/vmware-tools sudo apt-get autoremove open-vm-tools --purge再下载open-vm-tools s…

使用原生 OpenTelemetry 解锁各种可能性:优先考虑可靠性,而不是专有限制

作者&#xff1a;来自 Elastic Bahubali Shetti•Miguel Luna Elastic 现在支持使用 OTel Operator 在 Kubernetes 上部署和管理 Elastic Distributions of OpenTelemetry (EDOT)。SRE 现在可以访问开箱即用的配置和仪表板&#xff0c;这些配置和仪表板旨在通过 Elastic Observ…

【freertos】FreeRTOS信号量的介绍及使用

FreeRTOS信号量 一、概述二、PV原语三、函数接口1.创建一个计数信号量2.删除一个信号量3.信号量释放4.在中断释放信号量5.获取一个信号量&#xff0c;可以是二值信号量、计数信号量、互斥量。6.在中断获取一个信号量&#xff0c;可以是二值信号量、计数信号量7.创建一个二值信号…

【生物服务器】数据分析//论文润色/组学技术服务 、表观组分析、互作组分析、遗传转化实验、生物医学

DNA亲和纯化测序&#xff08;DAP-seq&#xff09;和组蛋白甲基化修饰是表观遗传学研究中两个重要的技术手段&#xff0c;它们在揭示基因表达调控机制和染色质结构动态变化中发挥着关键作用。然而&#xff0c;在实践过程中&#xff0c;这两种技术也存在一些痛点和挑战。 DNA亲和…

丹摩征文活动| 摩智云端深度解析:Faster R-CNN模型的训练与测试实战指南

目录 丹摩简介 文章前言Faster R-CNN的简介Faster RCNN的训练与测试提前准备1.1 mobaxterm&#xff08;远程连接服务器&#xff09;1.2 本文的源码下载 目标检测模型 Faster-Rcnn2.1云服务器平台 数据上传内置JupyterLab的使用本地连接使用DAMODEL实例获取实例的SSH访问信息通过…

二叉搜索树介绍

⼆叉搜索树 二叉搜索树的概念二叉搜索树的性能分析查找性能插入性能删除性能 二叉搜索树的插入二叉搜索树的查找二叉搜索树的删除⼆叉搜索树的实现代码测试代码 二叉搜索树key和key/value使⽤场景key搜索场景key/value搜索场景key/value⼆叉搜索树代码实现测试代码 二叉搜索树的…

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

5.4.2-1 编写Java程序在HDFS上创建文件

本次实战涉及使用Java操作Hadoop HDFS&#xff0c;包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务&#xff0c;成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践&#xff0c;如检查文件存在性以避免重复创建&#xff0c;以及处理HDFS安全…

RabbitMQ教程:路由(Routing)(四)

文章目录 RabbitMQ教程&#xff1a;路由&#xff08;Routing&#xff09;&#xff08;四&#xff09;一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…

智云-一个抓取web流量的轻量级蜜罐v1.5

智云-一个抓取web流量的轻量级蜜罐v1.5 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN 新增功能-自定义漏洞信息 可通过正则来添加相关路由以及响应来伪造 nacos的版本响应如下 日流量态势 月流量态势 抓取流量效果

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档&#xff1a; 3.加载游戏&#xff0c;保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂&#xff0c;中间没有运行程序进行阶段性成果的验…

实验5:网络设备发现、管理和维护

实验5&#xff1a;网络设备发现、管理和维护 实验目的及要求&#xff1a; 通过实验&#xff0c;掌握Cisco 路由器和交换机的IOS配置管理。自动从NTP服务器获取时间信息。能够利用TFTP服务器实现路由器和交换机配置文件的备份和恢复。同时验证CDP协议和LLDP协议的网络参数。完…

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…