UML类图的六大关系:依赖,泛化,实现,关联,聚合,组合

news2025/1/5 8:15:39

1.依赖关系

依赖关系是 UML 类图中一种相对较弱的关系,用于表明一个类在某种程度上依赖于另一个类来完成特定任务。当类 A 的某个方法使用了类 B 的对象作为参数、局部变量,或是调用了类 B 的静态方法时,就存在类 A 对类 B 的依赖关系。这种关系通常是临时性的,仅在类 A 执行特定操作时才会关联到类 B。

  • 特点
    • 临时性:依赖关系不像关联、聚合、组合那样表示类之间长期稳定的结构联系,它只是方法执行期间的短暂关联。
    • 单向或双向:可以是单向的,即 A 依赖 B 但 B 不依赖 A;也可能是双向的,不过较为少见,意味着双方的方法互相有所依赖。
    • 松散耦合:依赖关系下的两个类耦合度较低,被依赖类的变动对依赖类的影响范围通常局限于使用到的具体方法。
  1. 使用对象作为参数产生依赖
    在这段代码中,ReportWriter类依赖于Printer类。ReportWriter类的generateReport方法需要借助Printer类的printText方法来输出报告内容,Printer类的对象作为参数传入,一旦generateReport方法执行完毕,这种依赖联系在本次操作中就结束了。
    class Printer {
    public:
        void printText(const std::string& text) {
            std::cout << text << std::endl;
        }
    };
    
    class ReportWriter {
    public:
        void generateReport(Printer& printer) {
            std::string report = "This is a sample report";
            printer.printText(report);
        }
    };
  2. 使用局部变量引发依赖
    MathStudent类的doHomework方法依赖Calculator类。在doHomework方法内部,创建了Calculator类的局部变量calc,并使用它的add方法完成计算,计算完成后,calc的生命周期结束,此次依赖关系也随之结束。
    class Calculator {
    public:
        int add(int a, int b) {
            return a + b;
        }
    };
    
    class MathStudent {
    public:
        void doHomework() {
            Calculator calc;
            int result = calc.add(3, 4);
            std::cout << "The result of calculation is: " << result << std::endl;
        }
    };
  3. 调用静态方法形成依赖
    Programmer类的writeCode方法依赖Logger类。通过调用Logger类的静态方法logMessageProgrammer类实现了记录日志的功能,这同样是一种依赖关系,而且由于调用静态方法,甚至不需要创建Logger类的实例。
    class Logger {
    public:
        static void logMessage(const std::string& msg) {
            std::cout << "Log: " << msg << std::endl;
        }
    };
    
    class Programmer {
    public:
        void writeCode() {
            Logger::logMessage("Writing some code...");
        }
    };

2.泛化关系

 

泛化关系(Generalization)在 UML 类图里体现的是一种继承关系,它遵循 “is-a” 原则,也就是子类是父类的一种特殊形式。通过泛化,子类能够继承父类的属性和方法,同时还能添加自身独有的属性与方法,实现代码复用与功能扩展。

 
  • 特点
    • 代码复用:父类定义了通用的属性与行为,子类无需重复编写,直接继承即可使用,节省开发精力。例如,若多个子类都需要某个共有的基础方法,在父类中定义一次就行。
    • 层次结构:构建起清晰的类层次体系,便于组织和管理复杂的类关系。比如在图形绘制系统中,各种具体图形类从通用的 “图形” 父类派生,逻辑清晰。
    • 多态支持:结合虚函数机制,子类能重写父类方法,让程序运行时基于对象实际类型来动态调用合适的方法,增强程序灵活性。
       
// 定义父类:动物类Animal
class Animal {
public:
    std::string name;
    Animal(const std::string& n) : name(n) {}

    virtual void makeSound() {
        std::cout << name << " makes a sound" << std::endl;
    }
};

// 定义子类:狗类Dog,继承自Animal类
class Dog : public Animal {
public:
    Dog(const std::string& n) : Animal(n) {}

    void makeSound() override {
        std::cout << name << " barks" << std::endl;
    }
};

// 定义子类:猫类Cat,继承自Animal类
class Cat : public Animal {
public:
    Cat(const std::string& n) : Animal(n) {}

    void makeSound() override {
        std::cout << name << " meows" << std::endl;
    }
};
// 图形基类
class Shape {
protected:
    int color;
public:
    Shape(int c) : color(c) {}
    virtual void draw() = 0;
    virtual double getArea() = 0;
};

// 圆形,继承自 Shape
class Circle : public Shape {
private:
    double radius;
public:
    Circle(int c, double r) : Shape(c), radius(r) {}
    void draw() override {
        std::cout << "Drawing a circle with color " << color << std::endl;
    }
    double getArea() override {
        return 3.14 * radius * radius;
    }
};

// 矩形,继承自 Shape
class Rectangle : public Shape {
private:
    double width, height;
public:
    Rectangle(int c, double w, double h) : Shape(c), width(w), height(h) {}
    void draw() override {
        std::cout << "Drawing a rectangle with color " << color << std::endl;
    }
    double getArea() override {
        return width * height;
    }
};
// 交通工具基类
class Vehicle {
protected:
    int speed;
    int wheels;
public:
    Vehicle(int s, int w) : speed(s), wheels(w) {}
    virtual void move() = 0;
};

// 汽车,继承自 Vehicle
class Car : public Vehicle {
public:
    Car(int s, int w) : Vehicle(s, w) {}
    void move() override {
        std::cout << "The car is moving at speed " << speed << " with " << wheels << " wheels." << std::endl;
    }
};

// 自行车,继承自 Vehicle
class Bicycle : public Vehicle {
public:
    Bicycle(int s, int w) : Vehicle(s, w) {}
    void move() override {
        std::cout << "The bicycle is moving at speed " << speed << " with " << wheels << " wheels." << std::endl;
    }
};
// 员工基类
class Employee {
protected:
    std::string name;
    int salary;
public:
    Employee(const std::string& n, int s) : name(n), salary(s) {}
    virtual void work() = 0;
};

// 程序员,继承自 Employee
class Programmer : public Employee {
public:
    Programmer(const std::string& n, int s) : Employee(n, s) {}
    void work() override {
        std::cout << name << " is coding." << std::endl;
    }
};

// 销售,继承自 Employee
class Salesperson : public Employee {
public:
    Salesperson(const std::string& n, int s) : Employee(n, s) {}
    void work() override {
        std::cout << name << " is selling." << std::endl;
    }
};

 

3.实现关系

 

在 UML 类图里,实现关系指的是类与接口之间的一种契约关系。接口定义了一组抽象的操作(方法),而实现类负责为这些抽象操作提供具体的实现代码,以此来满足接口所设定的行为规范。这种关系让程序具备更好的灵活性与可扩展性,不同的实现类能够替换使用,只要它们遵循相同的接口标准。

 
  • 特点
    • 抽象性与具体性结合:接口作为抽象的概念,仅勾勒行为轮廓,不涉及具体实现细节;实现类则把这些抽象方法落地,化为真实可执行的代码。
    • 多态支持:基于实现关系,程序能利用多态特性,通过接口类型的指针或引用,调用不同实现类的对应方法,增强代码灵活性,使程序可以动态适应变化。
    • 解耦与可替换性:依赖接口编程,而非依赖具体类,能降低类与类之间的耦合度。当需要更换功能实现时,只要新的实现类遵循原接口,就能无缝替换,无需大面积改动代码。
// 定义接口类:可绘制接口 Drawable
class Drawable {
public:
    virtual void draw() = 0;
};

// 定义实现类:圆形类 Circle,实现 Drawable 接口
class Circle : public Drawable {
public:
    void draw() override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

// 定义实现类:矩形类 Rectangle,实现 Drawable 接口
class Rectangle : public Drawable {
public:
    void draw() override {
        std::cout << "Drawing a rectangle." << std::endl;
    }
};
// 图形渲染接口
class GraphicRenderer {
public:
    virtual void render() = 0;
    virtual ~GraphicRenderer() = default;
};

// OpenGL 渲染实现类
class OpenGLRenderer : public GraphicRenderer {
public:
    void render() override {
        std::cout << "Rendering using OpenGL" << std::endl;
    }
};

// Vulkan 渲染实现类
class VulkanRenderer : public GraphicRenderer {
public:
    void render() override {
        std::cout << "Rendering using Vulkan" << std::endl;
    }
};
// 数据持久化接口
class DataPersistence {
public:
    virtual void saveData(const std::string& data) = 0;
    virtual std::string loadData() = 0;
    virtual ~DataPersistence() = default;
};

// 文件系统持久化实现类
class FileSystemPersistence : public DataPersistence {
public:
    void saveData(const std::string& data) override {
        std::ofstream file("data.txt");
        if (file.is_open()) {
            file << data;
            file.close();
        }
    }
    std::string loadData() override {
        std::ifstream file("data.txt");
        std::string result;
        if (file.is_open()) {
            std::getline(file, result);
            file.close();
        }
        return result;
    }
};

// 数据库持久化实现类
class DatabasePersistence : public DataPersistence {
public:
    void saveData(const std::string& data) override {
        // 假设这里有数据库连接和插入数据的代码
        std::cout << "Saving data to database: " << data << std::endl;
    }
    std::string loadData() override {
        // 假设这里有数据库查询和获取数据的代码
        return "Data from database";
    }
};
// 排序算法接口
class Sorter {
public:
    virtual void sort(std::vector<int>& data) = 0;
    virtual ~Sorter() = default;
};

// 冒泡排序实现类
class BubbleSorter : public Sorter {
public:
    void sort(std::vector<int>& data) override {
        int n = data.size();
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (data[j] > data[j + 1]) {
                    std::swap(data[j], data[j + 1]);
                }
            }
        }
    }
};

// 快速排序实现类
class QuickSorter : public Sorter {
public:
    void sort(std::vector<int>& data) override {
        // 快速排序的具体实现代码
        // 此处省略完整代码
        std::cout << "Sorting data with Quick Sort" << std::endl;
    }
};

 

4.关联关系

 

在 UML 类图里,关联关系用于表示类与类之间存在某种语义上的连接,这种连接通常意味着它们之间有稳定且长期的交互。关联关系可以是单向的,也可以是双向的,并且常带有多重性(Multiplicity)标识,用来表明一个类的对象与另一个类的对象之间数量上的对应关系。与依赖关系相比,关联关系更为紧密,它不是临时性的方法调用,而是类结构层面的一种联系。

 
  • 特点
    • 稳定性:关联关系描述的是类之间相对持久的关系,不像依赖关系那样只是在方法执行期间短暂出现。例如,在电商系统里,顾客和订单之间的关系就是长期稳定的,顾客长期会下订单,订单长期关联特定顾客。
    • 方向性:可以是单向关联,即一个类知晓另一个类,但反之不然;也能是双向关联,意味着双方类都清楚彼此的存在,能够互相访问。
    • 多重性:多重性用数字、范围或者特定符号(比如 “*” 表示多个 )在关联线上标注,精准定义两个类对象间数量对应,像一个班级有多个学生,一个学生只属于一个班级。
       
  1. 单向关联
    在这段代码中,Employee 类与 Company 类是单向关联关系,Employee 类持有指向 Company 类的指针,员工知晓自己所属的公司,能调用公司相关方法(如获取公司名 ),但公司类并没有反向关联员工类的设计。
    class Company;
    
    // 员工类
    class Employee {
    private:
        Company* employer;
    public:
        Employee(Company* c) : employer(c) {}
        void displayCompany() {
            if (employer!= nullptr) {
                std::cout << "Works for: " << employer->getName() << std::endl;
            }
        }
    };
    
    // 公司类
    class Company {
    private:
        std::string name;
    public:
        Company(const std::string& n) : name(n) {}
        std::string getName() {
            return name;
        }
    };
  2. 双向关联
    这里,Student 类和 Teacher 类呈现双向关联。学生类持有教师类的指针向量,方便添加、罗列自己的教师;教师类也持有学生类的指针向量,能添加学生,双方类都对彼此存在关联,体现了较为紧密的长期互动关系。
    class Teacher;
    
    // 学生类
    class Student {
    private:
        std::vector<Teacher*> teachers;
    public:
        void addTeacher(Teacher* t) {
            teachers.push_back(t);
        }
        void listTeachers() {
            for (auto teacher : teachers) {
                std::cout << "Has teacher: " << teacher->getName() << std::endl;
            }
        }
    };
    
    // 教师类
    class Teacher {
    private:
        std::vector<Student*> students;
    public:
        void addStudent(Student* s) {
            students.push_back(s);
        }
        std::string getName() {
            return "Teacher Name";
        }
    };
  3. 带多重性的关联
    在 UML 类图里,Team 类与 Player 类的关联线旁可标注 “1..*”,意味着一个球队有 1 个到多个球员 ,在代码里用std::vector<Player*>实现了这种一对多的数量对应关系,表明了类之间基于数量的关联特性。
    // 球队类
    class Team {
    private:
        std::vector<Player*> players;
    public:
        void addPlayer(Player* p) {
            players.push_back(p);
        }
    };
    
    // 球员类
    class Player {
    };

 

5.聚合关系

 

聚合关系是 UML 类图里表示整体与部分关系的一种,它属于特殊的关联关系。在聚合关系中,部分能够独立于整体存在,整体和部分有着各自的生命周期。整体对象包含对部分对象的引用,不过,部分对象的所有权不完全归属于整体对象,也就是说,即使整体被销毁了,部分依然可以存活,并且能被其他整体对象复用。

 
  • 特点
    • 弱拥有关系:整体 “拥有” 部分,但这种拥有比较松散,部分并不紧密依附于特定的整体。例如,一台电脑有一个硬盘,硬盘坏了可以拆下来装到别的电脑上,硬盘有独立于这台电脑的生存能力。
    • 独立生命周期:部分对象在整体对象创建之前可以已经存在,在整体对象销毁之后也能继续留存,二者生命周期没有强绑定。
    • 可替换性:由于部分的独立性,在需要的时候,很容易将某个部分从一个整体中拆卸下来,替换成其他同类型的部分。
// 定义部分类:发动机类 Engine
class Engine {
public:
    void start() {
        std::cout << "Engine started." << std::endl;
    }
};

// 定义整体类:汽车类 Car
class Car {
private:
    Engine* engine;
public:
    Car(Engine* e) : engine(e) {}
    ~Car() {
        // 汽车销毁时,不负责销毁发动机
        // 因为发动机有自己独立的生命周期
    }
    void drive() {
        if (engine!= nullptr) {
            engine->start();
            std::cout << "Car is driving." << std::endl;
        }
    }
};
// 定义球员类
class Player {
private:
    std::string name;
public:
    Player(const std::string& n) : name(n) {}
    void play() {
        std::cout << name << " is playing." << std::endl;
    }
};

// 定义球队类
class Team {
private:
    std::vector<Player*> players;
public:
    void addPlayer(Player* p) {
        players.push_back(p);
    }

    ~Team() {
        // 球队解散时,球员不会随之消失
        // 他们可以转会到其他球队
        for (auto player : players) {
            delete player;
        }
        players.clear();
    }

    void playGame() {
        for (auto player : players) {
            player->play();
        }
        std::cout << "The team is playing a game." << std::endl;
    }
};
// 定义书籍类
class Book {
private:
    std::string title;
public:
    Book(const std::string& t) : title(t) {}
    std::string getTitle() {
        return title;
    }
};

// 定义图书馆类
class Library {
private:
    std::vector<Book*> books;
public:
    void addBook(Book* b) {
        books.push_back(b);
    }

    ~Library() {
        // 图书馆关闭时,书籍不会被销毁
        // 它们可以被转移到其他图书馆
        for (auto book : books) {
            delete book;
        }
        books.clear();
    }

    void listBooks() {
        for (auto book : books) {
            std::cout << book->getTitle() << std::endl;
        }
    }
};

 

6.组合关系

 

组合关系同样用于表示整体与部分的关系,但相较于聚合关系,它是一种更强的 “拥有” 形式。在组合关系里,部分不能脱离整体而独立存在,整体对象与部分对象的生命周期紧密绑定,当整体被销毁时,部分对象必然会随之销毁。组合关系体现了一种强内聚性,强调部分是整体不可或缺的一部分。

 
  • 特点
    • 强依赖:部分对象完全依赖于整体对象,离开整体,部分就失去了存在的意义。例如,在人体中,心脏是人体的一部分,脱离了人体,心脏就无法维持正常功能。
    • 同步生命周期:整体对象创建时,部分对象通常也随之创建;整体对象销毁时,部分对象会被自动销毁,它们的生命周期完全同步。
    • 紧密耦合:整体与部分之间耦合紧密,这意味着对整体或部分的修改,可能会较大程度影响另一方,不过也保证了数据的一致性和完整性。
// 定义部分类:心脏类 Heart
class Heart {
public:
    void beat() {
        std::cout << "Heart is beating." << std::endl;
    }
};

// 定义整体类:人类 Human
class Human {
private:
    Heart heart;
public:
    Human() {}
    ~Human() {
        // 当人类对象被销毁时,心脏对象也自动销毁
        // 无需额外处理
    }
    void live() {
        heart.beat();
        std::cout << "Human is living." << std::endl;
    }
};
// 按钮类
class Button {
public:
    void click() {
        std::cout << "Button is clicked." << std::endl;
    }
};

// 窗口类
class Window {
private:
    std::vector<Button> buttons;
public:
    Window() {
        // 初始化时创建按钮
        Button closeButton;
        Button minimizeButton;
        buttons.push_back(closeButton);
        buttons.push_back(minimizeButton);
    }
    void handleEvents() {
        for (auto& button : buttons) {
            button.click();
        }
    }
    ~Window() {
        // 当窗口被销毁时,按钮也随之销毁
        // 因为按钮是窗口的一部分,不能独立存在于这个窗口系统之外
    }
};
// 书页类
class Page {
private:
    std::string content;
public:
    Page(const std::string& c) : content(c) {}
    std::string getContent() {
        return content;
    }
};

// 书类
class Book {
private:
    std::vector<Page> pages;
public:
    Book() {
        // 初始化书页
        Page p1("This is the content of page 1.");
        Page p2("This is the content of page 2.");
        pages.push_back(p1);
        pages.push_back(p2);
    }
    void displayPages() {
        for (auto& page : pages) {
            std::cout << page.getContent() << std::endl;
        }
    }
    ~Book() {
        // 当书被销毁时,书页也随之销毁
        // 书页不能脱离书而独立存在
    }
};
// 发动机类
class Engine {
public:
    void start() {
        std::cout << "Engine is starting." << std::endl;
    }
};

// 汽车类
class Car {
private:
    Engine engine;
public:
    Car() {}
    void drive() {
        engine.start();
        std::cout << "The car is driving." << std::endl;
    }
    ~Car() {
        // 当汽车被销毁时,发动机也自动销毁
        // 因为发动机是汽车的一部分,不能独立存在
    }
};

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

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

相关文章

Python基于EasyOCR进行路灯控制箱图像文本识别项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着城市化进程的加快&#xff0c;智能城市建设成为了现代社会发展的重要方向。路灯作为城市基础设…

TDengine 新功能 VARBINARY 数据类型

1. 背景 VARBINARY 数据类型用于存储二进制数据&#xff0c;与 MySQL 中的 VARBINARY 数据类型功能相同&#xff0c;VARBINARY 数据类型长度可变&#xff0c;在创建表时指定最大字节长度&#xff0c;使用进按需分配存储&#xff0c;但不能超过建表时指定的最大值。 2. 功能说明…

使用位操作符实现加减乘除!

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;使用位操作符实现加减乘除 发布时间&#xff1a;2025.1.1 隶属专栏&#xff1a;C语言 目录 位操作实现加法运算&#xff08;&#xff09;原理代码示例 位操作实现减法运算&#xff08;-&#xff09;原理代码示例 位…

基于SpringBoot的题库管理系统的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

MATLAB条件判断(switch-case-otherwise-end型)

在条件判断时&#xff0c;遇到很多个条件&#xff0c;如果再用 i f − e l s e if-else if−else语句就显得很繁琐&#xff0c;所以我们可以用 s w i t c h switch switch来解决 结构&#xff1a; 判断对象可以为数字&#xff0c;也可以为字符 如图&#xff1a; 注意&#x…

windows文件夹自定义右键调用powershell完成7zip加密打包

准备powershell脚本 2. regedit的路径是&#xff1a;计算机\HKEY_CLASSES_ROOT\Directory\shell\&#xff0c;在此项目下新增子项目diy_command\command&#xff0c;command的数据值为powershell D:\windowsProjects\directory_diy.ps1 %1 效果&#xff0c;点击后进入和power…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程&#xff1a; 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程&#xff0c;包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程&#xff0c;带你从0开始&#xff0c;组装属于自己的自主无人机&#xff0c;并让…

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char &#xff08;属于整形家族&#xff09;类型 2. 位段的空间上是按照需要以4个字节&#xff08; 类型 int &#xff09;或者1个字节&#xff08; char &#xff09;的方式来开辟的。 3. 位段涉及…

【OceanBase】利用 OceanBase 向量检索能力构建文档智能问答小助手

文章目录 一、实验环境说明二、前期准备工作2.1 安装 Python 3.9 和 pip2.2 安装 Poetry2.3 安装并启动Docker(可选)2.4 安装 MySQL 客户端2.5 注册阿里云百炼账号并开通服务获取 API Key 三、构建智能问答小助手3.1 部署 OceanBase 集群3.1.1 方式一&#xff1a;使用 OBCloud …

http报头解析

http报文 http报文主要有两类是常见的&#xff0c;第一类是请求报文&#xff0c;第二类是响应报文&#xff0c;每个报头除了第一行&#xff0c;都是采用键值对进行传输数据&#xff0c;请求报文的第一行主要包括http方法&#xff08;GET&#xff0c;PUT&#xff0c; POST&#…

Lucene 漏洞历险记:修复损坏的索引异常

作者&#xff1a;来自 Elastic Benjamin Trent 有时&#xff0c;一行代码需要几天的时间才能写完。在这里&#xff0c;我们可以看到工程师在多日内调试代码以修复潜在的 Apache Lucene 索引损坏的痛苦。 做好准备 这篇博客与往常不同。它不是对新功能或教程的解释。这是关于花…

如何提升可视化大屏的用户体验?

一、什么是可视化大屏的用户体验 可视化大屏的用户体验是指用户在使用大屏幕可视化系统时所感受到的整体体验。这包括系统的易用性、交互性、视觉效果、信息展示方式等方面。一个好的可视化大屏用户体验应该能够让用户轻松地获取所需的信息&#xff0c;快速理解数据&#xff0…

overscroll-behavior-解决H5在ios上过度滚动的默认行为

1. 问题 开发H5的过程中&#xff0c;经常会有android和ios两边系统需要兼容的情况。在ios上一直有个问题是当H5内容触及到页面顶部或底部时&#xff0c;还是可以被人为的往下或往下拉动界面。当然可能有的情况是比较适用的&#xff0c;比如你往下拉动&#xff0c;然后在导航栏…

【无线传感网】无线传感器网络拓扑控制技术

文章目录 拓扑控制的意义影响整个网络的生存时间减小节点间通信干扰&#xff0c;提高网络通信效率为路由协议、时间同步提供基础影响数据融合弥补节点失效的影响 拓扑控制的设计目标能量消耗覆盖度连通性算法的分布式程度网络延迟&#x1f6a9;干扰和竞争对称性鲁棒性和可扩展性…

使用pandas把数据库中的数据转成csv文件

使用pandas把数据库中的数据转成csv文件 1、效果图 2、流程 1、连接数据库,获取数据 2、把一些中文字符转成gbk,忽略掉无法转化的 3、把数据转成csv 3、代码 import pymysql import pandas as pddef get_database(databasename):

点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定(升级版)

文章目录 1、updateInviteCodeStatus2、handleLock3、InviteCodeController4、InviteCodeService5、CrudRepository 点击锁定按钮&#xff0c;锁定按钮要变成解锁按钮&#xff0c;然后状态要从待绑定变成 已锁定&#xff1a;https://blog.csdn.net/m0_65152767/article/details…

活动报名系统源码:JAVA同城服务系统活动报名同城圈子商家商城城市代理躲猫猫

JAVA同城服务系统&#xff1a;打造多元化社交与娱乐新体验 在数字化时代&#xff0c;同城服务系统已成为连接城市生活的重要桥梁。我们精心打造的JAVA同城服务系统&#xff0c;不仅融合了活动报名、同城圈子、商家商城、城市代理等多重功能&#xff0c;还特别加入了创新的“躲…

【大模型实战篇】LLaMA Factory微调ChatGLM-4-9B模型

1. 背景介绍 虽然现在大模型微调的文章很多&#xff0c;但纸上得来终觉浅&#xff0c;大模型微调的体感还是需要自己亲自上手实操过&#xff0c;才能有一些自己的感悟和直觉。这次我们选择使用llama_factory来微调chatglm-4-9B大模型。 之前微调我们是用两块3090GPU显卡&…

数势科技:解锁数据分析 Agent 的智能密码(14/30)

一、数势科技引领数据分析变革 在当今数字化浪潮中&#xff0c;数据已然成为企业的核心资产&#xff0c;而数据分析则是挖掘这一资产价值的关键钥匙。数势科技&#xff0c;作为数据智能领域的领军者&#xff0c;以其前沿的技术与创新的产品&#xff0c;为企业开启了高效数据分析…

[卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析

目录 [卫星遥感] 解密卫星目标跟踪&#xff1a;挑战与突破的深度剖析 1. 卫星目标跟踪的核心挑战 1.1 目标的高速与不确定性 1.2 卫星传感器的局限性 1.3 数据处理与融合问题 1.4 大尺度与实时性要求 2. 当前卫星目标跟踪的主流技术 2.1 卡尔曼滤波&#xff08;Kalman …