当前位置: 首页 > news >正文

C++中的设计模式

设计模式是软件工程中用于解决常见问题的可复用解决方案。它们提供了一种标准化的方法来设计和实现软件系统,从而提高代码的可维护性、可扩展性和可重用性。C++ 是一种支持多种编程范式(如面向对象、泛型编程等)的语言,因此可以方便地实现各种设计模式。

以下是 C++ 中常见的设计模式,按类别进行分类:

创建型模式(Creational Patterns)

这些模式用于创建对象,同时隐藏创建逻辑,而不是直接使用 new 操作符实例化对象。

  1. 单例模式(Singleton)

    • 目的:确保一个类只有一个实例,并提供一个全局访问点。

    • 实现:通过私有化构造函数和析构函数,禁止拷贝构造和赋值操作,并提供一个静态方法来获取唯一的实例。

    • 示例

      class Singleton {
      private:static Singleton* instance;Singleton() {} // 私有化构造函数
      public:static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}
      };
      Singleton* Singleton::instance = nullptr;
  2. 工厂模式(Factory)

    • 目的:定义一个创建对象的接口,让子类决定实例化哪一个类。

    • 实现:创建一个工厂类,该类包含一个工厂方法,用于创建对象。

    • 示例

      class Product {
      public:virtual void use() = 0;
      };class ConcreteProductA : public Product {
      public:void use() override {std::cout << "Using ConcreteProductA" << std::endl;}
      };class ConcreteProductB : public Product {
      public:void use() override {std::cout << "Using ConcreteProductB" << std::endl;}
      };class Factory {
      public:virtual Product* createProduct() = 0;
      };class ConcreteFactoryA : public Factory {
      public:Product* createProduct() override {return new ConcreteProductA();}
      };class ConcreteFactoryB : public Factory {
      public:Product* createProduct() override {return new ConcreteProductB();}
      };
  3. 抽象工厂模式(Abstract Factory)

    • 目的:创建相关或依赖对象的家族,而不需明确指定具体类。

    • 实现:定义一个抽象工厂接口,包含多个工厂方法,每个方法创建一个具体的产品。

    • 示例

      // 省略具体实现,与工厂模式类似,但包含多个工厂方法
  4. 建造者模式(Builder)

    • 目的:构建一个复杂的对象,并允许用户只通过指定复杂对象的类型和内容就能构建它们,隐藏了复杂对象的构建细节。

    • 实现:创建一个建造者类,逐步构建对象,最后返回完整的对象。

    • 示例

      class Product {
      public:void setPartA() {}void setPartB() {}
      };class Builder {
      public:virtual void buildPartA() = 0;virtual void buildPartB() = 0;virtual Product* getResult() = 0;
      };class ConcreteBuilder : public Builder {
      private:Product* product;
      public:ConcreteBuilder() {product = new Product();}void buildPartA() override {product->setPartA();}void buildPartB() override {product->setPartB();}Product* getResult() override {return product;}
      };class Director {
      public:void construct(Builder* builder) {builder->buildPartA();builder->buildPartB();}
      };
  5. 原型模式(Prototype)

    • 目的:通过复制现有的实例来创建新的实例,而不是通过新建实例。

    • 实现:定义一个原型接口,包含一个克隆方法。

    • 示例

      class Prototype {
      public:virtual Prototype* clone() = 0;
      };class ConcretePrototype : public Prototype {
      public:ConcretePrototype* clone() override {return new ConcretePrototype(*this);}
      };

结构型模式(Structural Patterns)

这些模式用于对象组合,通常用于实现对象间的关系,让它们能够协同工作。

  1. 适配器模式(Adapter)

    • 目的:允许将不兼容的接口转换为一个兼容的接口。

    • 实现:创建一个适配器类,实现目标接口,并在内部封装一个适配者对象。

    • 示例

      class Target {
      public:virtual void request() = 0;
      };class Adaptee {
      public:void specificRequest() {std::cout << "Specific request" << std::endl;}
      };class Adapter : public Target {
      private:Adaptee* adaptee;
      public:Adapter() {adaptee = new Adaptee();}void request() override {adaptee->specificRequest();}
      };
  2. 桥接模式(Bridge)

    • 目的:将抽象与实现解耦,让它们可以独立变化。

    • 实现:创建一个桥接接口,将抽象部分与实现部分分离。

    • 示例

      class Implementor {
      public:virtual void operationImpl() = 0;
      };class ConcreteImplementorA : public Implementor {
      public:void operationImpl() override {std::cout << "ConcreteImplementorA" << std::endl;}
      };class ConcreteImplementorB : public Implementor {
      public:void operationImpl() override {std::cout << "ConcreteImplementorB" << std::endl;}
      };class Abstraction {
      protected:Implementor* implementor;
      public:Abstraction(Implementor* impl) : implementor(impl) {}virtual void operation() {implementor->operationImpl();}
      };class RefinedAbstraction : public Abstraction {
      public:RefinedAbstraction(Implementor* impl) : Abstraction(impl) {}void operation() override {std::cout << "RefinedAbstraction" << std::endl;Abstraction::operation();}
      };
  3. 组合模式(Composite)

    • 目的:将对象组合成树形结构以表示“部分-整体”的层次结构。

    • 实现:创建一个组件接口,定义叶子节点和组合节点的行为。

    • 示例

      class Component {
      public:virtual void operation() = 0;virtual void add(Component* component) {}virtual void remove(Component* component) {}
      };class Leaf : public Component {
      public:void operation() override {std::cout << "Leaf operation" << std::endl;}
      };class Composite : public Component {
      private:std::vector<Component*> children;
      public:void operation() override {std::cout << "Composite operation" << std::endl;for (auto* child : children) {child->operation();}}void add(Component* component) override {children.push_back(component);}void remove(Component* component) override {children.erase(std::remove(children.begin(), children.end(), component), children.end());}
      };
  4. 装饰器模式(Decorator)

    • 目的:动态地给一个对象添加额外的职责。

    • 实现:创建一个装饰器类,继承自目标类,并在内部封装一个目标对象。

    • 示例

      class Component {
      public:virtual void operation() = 0;
      };class ConcreteComponent : public Component {
      public:void operation() override {std::cout << "ConcreteComponent operation" << std::endl;}
      };class Decorator : public Component {
      protected:Component* component;
      public:Decorator(Component* comp) : component(comp) {}void operation() override {component->operation();}
      };class ConcreteDecoratorA : public Decorator {
      public:ConcreteDecoratorA(Component* comp) : Decorator(comp) {}void operation() override {std::cout << "ConcreteDecoratorA operation" << std::endl;Decorator::operation();}
      };class ConcreteDecoratorB : public Decorator {
      public:ConcreteDecoratorB(Component* comp) : Decorator(comp) {}void operation() override {std::cout << "ConcreteDecoratorB operation" << std::endl;Decorator::operation();}
      };
  5. 外观模式(Facade)

    • 目的:提供一个统一的高层接口,用于访问子系统中的一群接口。

    • 实现:创建一个外观类,封装子系统的复杂性。

    • 示例

      class SubsystemA {
      public:void operationA() {std::cout << "SubsystemA operation" << std::endl;}
      };class SubsystemB {
      public:void operationB() {std::cout << "SubsystemB operation" << std::endl;}
      };class Facade {
      private:SubsystemA* subsystemA;SubsystemB* subsystemB;
      public:Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();}void operation() {subsystemA->operationA();subsystemB->operationB();}
      };
  6. 享元模式(Flyweight)

    • 目的:通过共享来高效地支持大量细粒度的对象。

    • 实现:创建一个享元工厂,管理共享对象。

    • 示例

      class Flyweight {
      public:virtual void operation() = 0;
      };class ConcreteFlyweight : public Flyweight {
      public:void operation() override {std::cout << "ConcreteFlyweight operation" << std::endl;}
      };class FlyweightFactory {
      private:std::map<std::string, Flyweight*> flyweights;
      public:Flyweight* getFlyweight(const std::string& key) {if (flyweights.find(key) == flyweights.end()) {flyweights[key] = new ConcreteFlyweight();}return flyweights[key];}
      };
  7. 代理模式(Proxy)

    • 目的:为其他对象提供一种代理,以控制对这个对象的访问。

    • 实现:创建一个代理类,实现与目标类相同的接口,并在内部封装一个目标对象。

    • 示例

      class Subject {
      public:virtual void request() = 0;
      };class RealSubject : public Subject {
      public:void request() override {std::cout << "RealSubject request" << std::endl;}
      };class Proxy : public Subject {
      private:RealSubject* realSubject;
      public:void request() override {if (realSubject == nullptr) {realSubject = new RealSubject();}realSubject->request();}
      };

行为型模式(Behavioral Patterns)

这些模式用于对象间的行为和通信,通常用于实现对象间复杂的交互。

  1. 策略模式(Strategy)

    • 目的:定义一系列算法,把它们一个个封装起来,并使它们可互换。

    • 实现:创建一个策略接口,定义算法的接口,并在具体策略类中实现算法。

    • 示例

      class Strategy {
      public:virtual void algorithmInterface() = 0;
      };class ConcreteStrategyA : public Strategy {
      public:void algorithmInterface() override {std::cout << "ConcreteStrategyA algorithm" << std::endl;}
      };class ConcreteStrategyB : public Strategy {
      public:void algorithmInterface() override {std::cout << "ConcreteStrategyB algorithm" << std::endl;}
      };class Context {
      private:Strategy* strategy;
      public:Context(Strategy* strat) : strategy(strat) {}void setStrategy(Strategy* strat) {strategy = strat;}void contextInterface() {strategy->algorithmInterface();}
      };
  2. 模板方法模式(Template Method)

    • 目的:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。

    • 实现:创建一个抽象类,定义算法的骨架,并在子类中实现具体步骤。

    • 示例

      class AbstractClass {
      public:void templateMethod() {primitiveOperation1();primitiveOperation2();}
      protected:virtual void primitiveOperation1() = 0;virtual void primitiveOperation2() = 0;
      };class ConcreteClassA : public AbstractClass {
      protected:void primitiveOperation1() override {std::cout << "ConcreteClassA primitiveOperation1" << std::endl;}void primitiveOperation2() override {std::cout << "ConcreteClassA primitiveOperation2" << std::endl;}
      };class ConcreteClassB : public AbstractClass {
      protected:void primitiveOperation1() override {std::cout << "ConcreteClassB primitiveOperation1" << std::endl;}void primitiveOperation2() override {std::cout << "ConcreteClassB primitiveOperation2" << std::endl;}
      };
  3. 观察者模式(Observer)

    • 目的:定义对象间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。

    • 实现:创建一个主题接口和观察者接口,主题维护观察者列表,并在状态改变时通知观察者。

    • 示例

      class Observer {
      public:virtual void update() = 0;
      };class Subject {
      private:std::vector<Observer*> observers;
      public:void attach(Observer* observer) {observers.push_back(observer);}void detach(Observer* observer) {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void notify() {for (auto* observer : observers) {observer->update();}}
      };class ConcreteObserverA : public Observer {
      public:void update() override {std::cout << "ConcreteObserverA update" << std::endl;}
      };class ConcreteObserverB : public Observer {
      public:void update() override {std::cout << "ConcreteObserverB update" << std::endl;}
      };
  4. 迭代器模式(Iterator)

    • 目的:提供一种顺序访问一个聚合对象中各个元素的方法,而不暴露其内部的表示。

    • 实现:创建一个迭代器接口,定义遍历聚合对象的方法。

    • 示例

      class Iterator {
      public:virtual void first() = 0;virtual void next() = 0;virtual bool isDone() = 0;virtual int currentItem() = 0;
      };class Aggregate {
      public:virtual Iterator* createIterator() = 0;
      };class ConcreteAggregate : public Aggregate {
      private:std::vector<int> items;
      public:ConcreteAggregate() {items = {1, 2, 3, 4, 5};}Iterator* createIterator() override {return new ConcreteIterator(this);}int getAt(int index) {return items[index];}int size() {return items.size();}
      };class ConcreteIterator : public Iterator {
      private:ConcreteAggregate* aggregate;int current;
      public:ConcreteIterator(ConcreteAggregate* agg) : aggregate(agg), current(0) {}void first() override {current = 0;}void next() override {current++;}bool isDone() override {return current >= aggregate->size();}int currentItem() override {return aggregate->getAt(current);}
      };
  5. 责任链模式(Chain of Responsibility)

    • 目的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

    • 实现:创建一个处理者接口,定义处理请求的方法,并在具体处理者中实现具体的处理逻辑。

    • 示例

      class Handler {
      protected:Handler* successor;
      public:Handler(Handler* succ) : successor(succ) {}virtual void handleRequest(int request) {if (successor != nullptr) {successor->handleRequest(request);}}
      };class ConcreteHandlerA : public Handler {
      public:ConcreteHandlerA(Handler* succ) : Handler(succ) {}void handleRequest(int request) override {if (request >= 0 && request < 10) {std::cout << "ConcreteHandlerA handled request" << std::endl;} else {Handler::handleRequest(request);}}
      };class ConcreteHandlerB : public Handler {
      public:ConcreteHandlerB(Handler* succ) : Handler(succ) {}void handleRequest(int request) override {if (request >= 10 && request < 20) {std::cout << "ConcreteHandlerB handled request" << std::endl;} else {Handler::handleRequest(request);}}
      };
  6. 命令模式(Command)

    • 目的:将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。

    • 实现:创建一个命令接口,定义执行操作的方法,并在具体命令类中实现具体的操作。

    • 示例

      class Receiver {
      public:void action() {std::cout << "Receiver action" << std::endl;}
      };class Command {
      public:virtual void execute() = 0;
      };class ConcreteCommand : public Command {
      private:Receiver* receiver;
      public:ConcreteCommand(Receiver* recv) : receiver(recv) {}void execute() override {receiver->action();}
      };class Invoker {
      private:Command* command;
      public:void setCommand(Command* cmd) {command = cmd;}void executeCommand() {command->execute();}
      };
  7. 备忘录模式(Memento)

    • 目的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

    • 实现:创建一个备忘录类,保存对象的状态,并在发起人和管理者之间传递备忘录。

    • 示例

      class Memento {
      private:std::string state;
      public:Memento(const std::string& state) : state(state) {}std::string getState() {return state;}
      };class Originator {
      private:std::string state;
      public:void setState(const std::string& state) {this->state = state;}std::string getState() {return state;}Memento* createMemento() {return new Memento(state);}void setMemento(Memento* memento) {state = memento->getState();}
      };class Caretaker {
      private:Memento* memento;
      public:void save(Originator* originator) {memento = originator->createMemento();}void undo(Originator* originator) {originator->setMemento(memento);}
      };
  8. 状态模式(State)

    • 目的:允许一个对象在其内部状态改变时改变其行为。

    • 实现:创建一个状态接口,定义状态的行为,并在具体状态类中实现具体的行为。

    • 示例

      class Context {
      private:State* state;
      public:Context(State* state) : state(state) {}void setState(State* state) {this->state = state;}void request() {state->handle(this);}
      };class State {
      public:virtual void handle(Context* context) = 0;
      };class ConcreteStateA : public State {
      public:void handle(Context* context) override {std::cout << "ConcreteStateA handle" << std::endl;context->setState(new ConcreteStateB());}
      };class ConcreteStateB : public State {
      public:void handle(Context* context) override {std::cout << "ConcreteStateB handle" << std::endl;context->setState(new ConcreteStateA());}
      };
  9. 访问者模式(Visitor)

    • 目的:为一个对象结构中的对象添加新的能力。

    • 实现:创建一个访问者接口,定义访问对象的方法,并在具体访问者类中实现具体的访问逻辑。

    • 示例

      class Element {
      public:virtual void accept(Visitor* visitor) = 0;
      };class ConcreteElementA : public Element {
      public:void accept(Visitor* visitor) override {visitor->visitConcreteElementA(this);}
      };class ConcreteElementB : public Element {
      public:void accept(Visitor* visitor) override {visitor->visitConcreteElementB(this);}
      };class Visitor {
      public:virtual void visitConcreteElementA(ConcreteElementA* element) = 0;virtual void visitConcreteElementB(ConcreteElementB* element) = 0;
      };class ConcreteVisitor : public Visitor {
      public:void visitConcreteElementA(ConcreteElementA* element) override {std::cout << "ConcreteVisitor visitConcreteElementA" << std::endl;}void visitConcreteElementB(ConcreteElementB* element) override {std::cout << "ConcreteVisitor visitConcreteElementB" << std::endl;}
      };
  10. 中介者模式(Mediator)

    • 目的:用一个中介对象来封装一系列的对象交互。

    • 实现:创建一个中介者接口,定义协调对象交互的方法,并在具体中介者类中实现具体的协调逻辑。

    • 示例

      class Mediator {
      public:virtual void notify(Component* component, const std::string& event) = 0;
      };class Component {
      protected:Mediator* mediator;
      public:Component(Mediator* mediator) : mediator(mediator) {}virtual void doA() = 0;virtual void doB() = 0;
      };class ConcreteComponentA : public Component {
      public:ConcreteComponentA(Mediator* mediator) : Component(mediator) {}void doA() override {std::cout << "ConcreteComponentA doA" << std::endl;mediator->notify(this, "A");}void doB() override {std::cout << "ConcreteComponentA doB" << std::endl;}
      };class ConcreteComponentB : public Component {
      public:ConcreteComponentB(Mediator* mediator) : Component(mediator) {}void doA() override {std::cout << "ConcreteComponentB doA" << std::endl;}void doB() override {std::cout << "ConcreteComponentB doB" << std::endl;mediator->notify(this, "B");}
      };class ConcreteMediator : public Mediator {
      private:ConcreteComponentA* componentA;ConcreteComponentB* componentB;
      public:ConcreteMediator(ConcreteComponentA* a, ConcreteComponentB* b) : componentA(a), componentB(b) {}void notify(Component* component, const std::string& event) override {if (component == componentA && event == "A") {componentB->doB();} else if (component == componentB && event == "B") {componentA->doA();}}
      };

这些设计模式在实际开发中非常有用,可以帮助你设计出更加灵活、可维护和可扩展的系统。选择合适的设计模式需要根据具体问题和需求来决定。

相关文章:

C++中的设计模式

设计模式是软件工程中用于解决常见问题的可复用解决方案。它们提供了一种标准化的方法来设计和实现软件系统&#xff0c;从而提高代码的可维护性、可扩展性和可重用性。C 是一种支持多种编程范式&#xff08;如面向对象、泛型编程等&#xff09;的语言&#xff0c;因此可以方便…...

Java 设计模式:装饰者模式详解

Java 设计模式&#xff1a;装饰者模式详解 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过动态地为对象添加新功能&#xff0c;扩展其行为&#xff0c;而无需修改原有类的代码。装饰者模式遵循“开闭原则”&#xff0c;提供了比…...

C++ 大数相加(简要版)

#include <algorithm> #include <iterator> class Solution { public:/*** 计算两个数之和* param s string字符串 表示第一个整数* param t string字符串 表示第二个整数* return string字符串*/string solve(string s, string t) {// 处理空字符串的情况&#xf…...

Spring IoC深度解析:掌控Bean存储艺术与分层架构的智慧​​

一、IoC的本质&#xff1a;从"造物主"到"使用者"的思维跃迁 在传统编程中&#xff0c;开发者像"造物主"一样亲手创建每个对象&#xff08;new UserController()&#xff09;&#xff0c;并管理它们的依赖关系。这种方式导致代码高度耦合&#xf…...

8.4 容器2

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 8.4.3 TabControl&#xff08;选项卡&#xff09;控件 TabControl控件可以通过设置多个选项卡页&#xff08;TabPage控件&#xff09…...

一组可能的机器学习问题列表

线性回归与多项式拟合的关系最小二乘法在机器学习中的应用梯度下降是如何实现的贝叶斯分类器的应用场景高斯分布与判定在哪里用到模型的评估有哪些参数误差中的偏差和方差定义训练集分组的快捷方式如何度量模型性能查准率查全率的定义roc,aux的含义正则化是什么意思k均值用来解…...

Android 权限列表

权限名称描述android.permission.ACCESS_CHECKIN_PROPERTIES访问登记属性读取或写入登记 check-in 数据库属性表的权限android.permission.ACCESS_COARSE_LOCATION获取粗略位置通过 WiFi 或移动基站的方式获取用户粗略的经纬度信息&#xff0c;定位精度大概误差在 30~1500 米an…...

探索在视频深度伪造中的细微的表情变化或对特定面部特征的小改动检测方法

概述 2019 年&#xff0c;美国众议院议长南希佩洛西成为了一次针对性的、技术含量相对较低的“深度伪造”式攻击的目标。真实的佩洛西视频被编辑&#xff0c;让她看起来像是喝醉了酒。这一不真实的事件在真相大白之前被分享了数百万次&#xff0c;而且在一些人没有关注后续报道…...

调用阿里云API实现身份证文字识别

TOC# 1.作者介绍 姚元帅&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2024级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;3183969029qq.com 乔幸荣&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2024级研究生&a…...

使用UFW+IPSET禁用海外IP配置持久化操作

上一章我们介绍了如何使用ufwipset禁用海外IP&#xff0c;但是如果服务器重启动&#xff0c;之前的配置就无效了&#xff0c;所以让配置持久化可以避免我们反复设置的麻烦。 IPSET配置持久化的方法有很多种&#xff0c;目前我配置成的是设置ipset后台服务&#xff0c;具体方法…...

深入Linux内核理解socket的本质

本文将从一个初学者的角度开始聊起&#xff0c;让大家了解 Socket 是什么以及它的原理和内核实现。 一、Socket 的概念 Socket 就如同我们日常生活中的插头与插座的连接关系。在网络编程中&#xff0c;Socket 是一种实现网络通信的接口或机制。 想象一下&#xff0c;插头插入…...

Python使用爬虫IP抓取数据过程

用户之前询问了不同语言的爬虫示例&#xff0c;特别是Python、Node.js和Ruby。现在他们希望详细扩展Python版本中使用代理IP的过程。 用户可能已经掌握了基本的爬虫编写&#xff0c;但遇到了IP被封的问题&#xff0c;或者想防止被封。他们需要知道如何集成代理IP到现有的代码中…...

通过MCP+数据库实现AI检索和分析

通过 MCP&#xff08;Multi-Agent Collaboration Platform&#xff0c;多智能体协作平台&#xff09; 数据库&#xff0c;实现一个AI检索和分析系统。 一、系统目标 实现通过 AI 多智能体对结构化&#xff08;数据库&#xff09;和非结构化&#xff08;文档、文本&#xff09…...

51单片机烧录程序演示教程

51单片机烧录程序演示教程 51单片机是一种经典的8位单片机&#xff0c;广泛应用于嵌入式系统开发中。烧录程序是指将编译好的代码下载到单片机的存储器中&#xff0c;以便单片机能够按照程序运行。以下是详细的烧录流程和步骤。 所需工具和材料 硬件&#xff1a; 51单片机开发…...

06软件测试需求分析案例-添加用户

给职业顾问部的老师添加用户密码后&#xff0c;他们才能登录使用该软件。只有admin账户具有添加用户、修改用户信息、删除用户的权利。admin是经理或团队的第一个人的账号&#xff0c;后面招一个教师就添加一个账号。 通读需求是提取信息&#xff0c;提出问题&#xff0c;输出…...

Asp.NET Core WebApi IOptions<T>详解

IOptions<T> 是 ASP.NET Core 中用于访问配置数据的一个接口&#xff0c;它属于 Microsoft.Extensions.Options 命名空间。通过 IOptions<T>&#xff0c;你可以将配置绑定到强类型的类中&#xff0c;并在应用程序的不同部分中注入和使用这些配置。这种方式不仅使得…...

Gartner发布软件供应链安全市场指南:软件供应链安全工具的8个强制功能、9个通用功能及全球29家供应商

攻击者的目标是由开源和商业软件依赖项、第三方 API 和 DevOps 工具链组成的软件供应链。软件工程领导者可以使用软件供应链安全工具来保护他们的软件免受这些攻击的连锁影响。 主要发现 越来越多的软件工程团队现在负责解决软件供应链安全 (SSCS) 需求。 软件工件、开发人员身…...

(四十三)Dart 中的空安全与 `required` 关键字

Dart 中的空安全与 required 关键字 空安全&#xff08;Null Safety&#xff09; 空安全&#xff08;Null Safety&#xff09;是 Dart 语言的一项重要特性&#xff0c;旨在帮助开发者避免空指针异常&#xff08;NullPointerException&#xff09;。空安全通过在编译时检查变量…...

《解锁分布式软总线:构建智能设备统一管理平台》

智能设备的数量呈爆发式增长&#xff0c;从智能家居里的各类电器&#xff0c;到智能办公中的电脑、打印机&#xff0c;再到工业领域的各种自动化设备&#xff0c;不一而足。如何对这些纷繁复杂的智能设备进行有效管理&#xff0c;成为摆在我们面前的一道难题。分布式软总线技术…...

【android bluetooth 协议分析 01】【HCI 层介绍 1】【hci_packets.pdl 介绍】

在 AOSP 的蓝牙协议栈 (Gabeldorsche) 中&#xff0c;hci_packets.pdl 是一个 协议描述语言文件&#xff0c;用于定义 HCI (Host Controller Interface) 层的数据包结构和通信协议。以下是详细解析&#xff1a; 1. 文件作用 system/gd/hci/hci_packets.pdl 协议自动化生成&…...

远程升级组件设计

----------------------- | 主应用程序 | ---------------------- | 通信接口&#xff08;使用本地socket通信发送给远程升级模块进程或者线程 | (如何启动进程程execl或execv函数&#xff09;,启动线程用std::sthread。 v ---------------------- 远程升级模块 ----------…...

Kubernetes集群环境搭建与初始化

1.Kubernetes简介&#xff1a; Kubernetes是Google开源的一个容器编排引擎&#xff0c;它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时&#xff0c;通常要部署该应用的多个实例以便对应用请求进行负载均衡。 在Kubernetes中&#xff0c;我…...

Compose 适配 - 响应式排版 自适应布局

一、概念 基于可用空间而非设备类型来设计自适应布局&#xff0c;实现设备无关性和动态适配性&#xff0c;避免硬编码&#xff0c;以不同形态布局更好的展示内容。 二、区分可用空间 WindowSizeClasses 传统根据屏幕大小和方向做适配的方式已不再适用&#xff0c;APP的显示方式…...

5G_WiFi_CE_DFS

目录 一、规范要求 1、法规目录 2、定义 3、运行模式 4、主/从设备相关的运行行为及具体的动态频率选择&#xff08;DFS&#xff09;要求 5、产品角色确定测试项目 6、测试项目 测试项1&#xff1a;信道可用性检查&#xff08;Channel Availability Check&#xff09; …...

Lalamove基于Flink实时湖仓演进之路

摘要&#xff1a;本文投稿自货拉拉国际化技术部 资深数据仓库工程师林海亮老师。内容分为以下几个部分&#xff1a; 1、业务简介 2、Flink 在业务中的应用与挑战 3、实时数仓架构的 Flink 驱动演进 4、未来展望 一、业务简介 Lalamove 于2013年在香港成立&#xff0c;是货拉拉的…...

【含文档+PPT+源码】基于微信小程序的卫生院预约挂号管理系统的设计与实现

项目视频介绍&#xff1a; 毕业作品基于微信小程序的卫生院预约挂号管理系统的设计与实现 课程简介&#xff1a; 本课程演示的是一款基于微信小程序的卫生院预约挂号管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习…...

人工智能100问☞第2问:机器学习的核心原理是什么?

目录 一、通俗解释 二、专业解析 三、权威参考 机器学习的核心原理是​​通过数据训练模型,使计算机自动发现数据中的内在规律或模式,并利用这些规律对新数据做出预测或决策​​。这一过程强调数据驱动(从经验中学习)、模型优化(通过损失函数和参数调整提升性能)以及泛…...

【深度学习基础】——机器的神经元:感知机

感知机模型的原理之前已经讲过&#xff08;【感知机模型 - CSDN App】https://blog.csdn.net/2401_88885149/article/details/145563837?sharetypeblog&shareId145563837&sharereferAPP&sharesource2401_88885149&sharefromlink&#xff09;但主要是从数学和机…...

OpenCV 图形API(29)图像滤波-----GMat类

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::GMat 是 OpenCV 的 G-API 模块中的一个核心类&#xff0c;用于定义计算图中的数据节点。G-API 是 OpenCV 中的一个模块&#xff0c;旨在通过…...

spark的堆外内存,是在jvm内还是操作系统内存内?

在 Apache Spark 中&#xff0c;堆外内存&#xff08;Off-Heap Memory&#xff09;是直接分配在操作系统的物理内存中&#xff0c;而非 JVM 堆内内存。以下是详细的解释&#xff1a; 1. 堆外内存的本质 操作系统管理 Spark 的堆外内存直接通过操作系统分配&#xff08;例如使用…...

AD9253 LVDS 高速ADC驱动开发

1、查阅AD9253器件手册 2、查阅Xilinx xapp524手册 3、该款ADC工作在125Msps下&#xff0c;14bit - 2Lane - 1frame 模式。 对应&#xff1a;data clock时钟为500M DDR mode。data line rate&#xff1a;1Gbps。frame clock&#xff1a;1/4 data clock 具体内容&#xff1a;…...

swift菜鸟教程14(闭包)

一个朴实无华的目录 今日学习内容&#xff1a;1.Swift 闭包1.1闭包定义1.2闭包实例1.3闭包表达式1.3.1sorted 方法&#xff1a;据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。1.3.2参数名称缩写&#xff1a;直接通过$0,$1,$2来顺序调用闭包的参数。1.3.3运算符函…...

【HarmonyOS NEXT+AI】问答02:有一点编程基础,可以学不?

在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面&#xff0c;有学员问&#xff0c;有一点编程基础&#xff0c;可以学不&#xff1f; 这里统一做下回复。 学习本课程只需要掌握任一编程语言即可&#xff0c;拥有JavaScript、TypeScript、ArkTS或Java语言基础更佳…...

maven 依赖的优先级

最短路径优先 工程中依赖了a、b两个jar包&#xff0c; 在a jar包内引用了b jar包版本为1.0&#xff0c;路径为&#xff1a;Project > a > b(1.0) 工程中直接依赖的b jar包版本为2.0&#xff0c;路径为&#xff1a;Project > b(2.0) 由于b(2.0)路径最短&#xff0…...

Java实现音频录音播放机功能

Java实现一个简单的音频录音和播放功能&#xff0c;使用Swing创建图形用户界面&#xff0c;利用Java Sound API进行音频处理。下面是对此程序的详细剖析&#xff1a; 一、程序结构 程序主要由以下几个部分组成&#xff1a; RecorderFrm类&#xff1a;主框架类&#xff0c;继承自…...

OpenCV 图形API(26)图像滤波-----方框滤波函数boxFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用方框滤波器模糊图像。 该函数使用以下内核来平滑图像&#xff1a; K α [ 1 1 … 1 1 1 … 1 ⋮ ⋮ ⋱ ⋮ 1 1 … 1 ] K \alpha \begin{b…...

oracle 表空间(Tablespace)

在 Oracle 11g 中&#xff0c;表空间&#xff08;Tablespace&#xff09; 是数据库存储架构的核心逻辑单元&#xff0c;其原理基于 逻辑存储与物理存储的分离&#xff0c;通过分层管理数据文件、段&#xff08;Segment&#xff09;、区&#xff08;Extent&#xff09;和数据块&…...

Git 高级操作

Git不仅是代码管理的基石工具&#xff0c;更是开发者提升效率的瑞士军刀。掌握基础操作只是起点&#xff0c;真正的高手都在使用进阶技巧优化工作流。本文将深入解析Git四大高阶操作&#xff0c;助你轻松应对复杂开发场景&#xff01; 一、交互式暂存&#xff1a;精准控制提交粒…...

Go:程序结构

文章目录 名称声明变量短变量声明指针new 函数变量的生命周期 赋值多重赋值可赋值性 类型声明包和文件导入包初始化 作用域 名称 命名规则&#xff1a; 通用规则&#xff1a;函数、变量、常量、类型、语句标签和包的名称&#xff0c;开头须是字母&#xff08;Unicode 字符 &a…...

sqlserver2017 分离附加数据库

分离数据库 分离数据库是指将数据库从 SQL Server 实例中移除&#xff0c;但会完整保留数据库及其数据文件和事务日志文件。 然后可以使用这些文件将数据库附加到任何 SQL Server 实例&#xff0c;包括分离该数据库的服务器。 如果存在下列任何情况&#xff0c;则不能分离数据…...

QuarkPi-CA2 RK3588S卡片电脑:6.0Tops NPU+8K视频编解码+接口丰富,高性能嵌入式开发!

QuarkPi-CA2 RK3588S卡片电脑&#xff1a;6.0Tops NPU8K视频编解码接口丰富&#xff0c;高性能嵌入式开发&#xff01; 芯片框架 视频介绍 https://www.bilibili.com/video/BV1btdbYkEjY 开发板介绍 核心升级&#xff0c;产品炸裂 QuarkPi-CA2卡片电脑搭载瑞芯微RK3588S芯片…...

对称加密与非对称加密与消息摘要算法保证https的数据交互的完整性和保密性

一、对称加密与非对称加密的作用 1. 对称加密 作用&#xff1a; 保密性&#xff1a;对称加密使用相同的密钥对数据进行加密和解密&#xff0c;确保数据在传输过程中不被窃听。效率&#xff1a;对称加密算法&#xff08;如AES&#xff09;计算速度快&#xff0c;适合加密大量数…...

Lab Cloud FPGA 硬件在线实验云平台介绍

友晶科技依托其在FPGA技术领域的深厚积累&#xff0c;成功研发出了一套完整的FPGA云平台解决方案&#xff08;即FPGA 硬件在线实验云&#xff0c;简称LabCloud &#xff09;。LabCloud 是一个高效、实用的学习平台&#xff0c;目前已在多个学校成功部署。 LabCloud 是通过 B/S …...

相机回调函数为静态函数原因

在注册相机SDK的回调函数时&#xff0c;是否需要设置为静态函数取决于具体SDK的设计要求&#xff0c;但通常需要遵循以下原则&#xff1a; 1. 必须使用静态函数的情况 当相机SDK是C语言接口或要求普通函数指针时&#xff0c;回调必须声明为静态成员函数或全局函数&#xff1a;…...

实验室纯水器实验室超纯水机(常见类型、选型建议、维护保养)

不同实验室用水级别有何差异&#xff1f; 实验室用水级别由ASTM或ISO 3696等质量标准定义&#xff0c;有助于特定应用选择适合的水质。这些标准也考虑了生产成本&#xff0c;如1级(Type 1)超纯水的生产成本远高于2级(Type 2)或3级(Type 3)纯水。 1级超纯水 不含离子&#xff…...

腾讯云COS与ZKmall 开源商城的存储集成方案

ZKmall 开源商城与腾讯云对象存储&#xff08;COS&#xff09;的集成&#xff0c;可通过云端资源托管、自动化数据同步、高性能存储架构实现本地存储负载降低与访问效率提升。以下是基于搜索结果的集成路径与核心优化点&#xff1a; 一、存储架构升级&#xff1a;本地与云端协同…...

Python 深度学习实战 第3章 Keras和TensorFlowKeras 训练和评估模型实例

Python 深度学习实战 第3章 Keras和TensorFlow&Keras 训练和评估模型实例 内容概要 第3章介绍了Keras和TensorFlow的基本概念及其关系&#xff0c;并指导如何设置深度学习工作区。本章还概述了核心深度学习概念如何转化为Keras和TensorFlow API。通过本章&#xff0c;读者…...

基于SpringBoot的动物救助中心系统(源码+数据库)

500基于SpringBoot的动物救助中心系统&#xff0c;本系统共分为2个角色&#xff1a;系统管理员、用户&#xff0c;主要功能如下 【管理员】&#xff1a; 1. 登录&#xff1a;管理员可以通过登录系统来管理各种功能。 2. 用户管理&#xff1a;管理员可以查看用户列表&#xff0…...

【多模态大模型】《Qwen2.5-Omni》 论文解读

《Qwen2.5-Omni&#xff1a;重新定义端到端全模态大模型的技术范式》 论文解读 论文&#xff1a; https://arxiv.org/abs/2503.20215 &#xff08;2025.03.26&#xff09;代码&#xff1a; https://github.com/QwenLM/Qwen2.5-OmniNews&#xff1a; https://mp.weixin.qq.com/…...

go 通过汇编分析函数传参与返回值机制

文章目录 概要一、前置知识二、汇编分析2.1、示例2.2、汇编2.2.1、 寄存器传值的汇编2.2.2、 栈内存传值的汇编 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中&#xff0c;我们研究了go函数调用时的栈布…...