03-行为型模式(共10种)

news2025/1/21 9:41:48

上一篇: 02-结构型设计模式(共7种)


1. Strategy(策略模式)

        策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装到独立的类中,并使它们可以互相替换。这样可以使算法的变化独立于使用算法的客户端。

        在 C++ 中,策略模式通常涉及以下几个角色:

        ①. Strategy(策略接口):定义了所有支持的算法的通用接口。

        ②. ConcreteStrategy(具体策略类):实现了策略接口,提供了具体的算法实现。

        ③. Context(上下文):维护一个对策略对象的引用,并在需要时调用策略对象的方法

        以下是模式示例:

#include <iostream>

// 策略接口
class Strategy {
public:
    virtual void execute() = 0;
};

// 具体策略类A
class ConcreteStrategyA : public Strategy {
public:
    void execute() override {
        std::cout << "Executing Strategy A" << std::endl;
    }
};

// 具体策略类B
class ConcreteStrategyB : public Strategy {
public:
    void execute() override {
        std::cout << "Executing Strategy B" << std::endl;
    }
};

// 上下文类
class Context {
private:
    Strategy* strategy;

public:
    Context(Strategy* strat) : strategy(strat) {}

    void setStrategy(Strategy* strat) {
        strategy = strat;
    }

    void executeStrategy() {
        strategy->execute();
    }
};

int main() {
    ConcreteStrategyA strategyA;
    ConcreteStrategyB strategyB;

    Context context(&strategyA);
    context.executeStrategy();

    context.setStrategy(&strategyB);
    context.executeStrategy();

    return 0;
}

2. Observer(观察者模式)

        观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式也被称为:发布-订阅(Publish-Subscribe)模式

        在 C++ 中,观察者模式通常涉及以下几个角色:

        ①. Subject(主题):定义了一个接口,用于添加、删除和通知观察者对象

        ②. ConcreteSubject(具体主题):实现了主题接口,并维护了观察者对象的列表,可以对观察者进行增加、删除和通知操作。

        ③. Observer(观察者):定义了一个接口,用于接收主题对象的通知。

        ④. ConcreteObserver(具体观察者):实现了观察者接口,并在接收到通知时执行相应的操作。

        以下是模式示例:

#include <iostream>
#include <vector>

// 观察者接口
class Observer {
public:
    virtual void update(const std::string& message) = 0;
};

// 具体观察者A
class ConcreteObserverA : public Observer {
public:
    void update(const std::string& message) override {
        std::cout << "Concrete Observer A received message: " << message << std::endl;
    }
};

// 具体观察者B
class ConcreteObserverB : public Observer {
public:
    void update(const std::string& message) override {
        std::cout << "Concrete Observer B received message: " << message << std::endl;
    }
};

// 主题接口
class Subject {
protected:
    std::vector<Observer*> observers;

public:
    virtual void attach(Observer* observer) {
        observers.push_back(observer);
    }

    virtual void detach(Observer* observer) {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    virtual void notify(const std::string& message) {
        for (Observer* observer : observers) {
            observer->update(message);
        }
    }
};

// 具体主题
class ConcreteSubject : public Subject {
public:
    void doSomething(const std::string& message) {
        std::cout << "Subject is doing something..." << std::endl;
        notify(message);
    }
};

int main() {
    ConcreteObserverA observerA;
    ConcreteObserverB observerB;

    ConcreteSubject subject;
    subject.attach(&observerA);
    subject.attach(&observerB);

    subject.doSomething("Hello observers!");

    subject.detach(&observerA);

    subject.doSomething("Hello again, with one less observer!");

    return 0;
}

3. Template Method(模板方法模式)

        模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将算法的具体步骤延迟到子类中实现。模板方法模式通过把不变行为放在父类中,将可变行为放在子类中,实现了代码复用和灵活性的结合

        在 C++ 中,模板方法模式通常涉及以下几个角色:

        ①. AbstractClass(抽象类):定义了一个模板方法,其中包含了算法的骨架,该方法可以包含若干抽象方法和具体方法。

        ②. ConcreteClass(具体类):继承自抽象类,实现了抽象方法,完成算法的具体步骤。

        以下是模式示例:

#include <iostream>

// 抽象类
class AbstractClass {
public:
    // 模板方法
    void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation();
        hook(); // 可选的钩子方法
    }

    // 抽象方法1
    virtual void primitiveOperation1() = 0;

    // 抽象方法2
    virtual void primitiveOperation2() = 0;

    // 具体方法
    void concreteOperation() {
        std::cout << "Concrete Operation" << std::endl;
    }

    // 钩子方法(可选实现)
    virtual void hook() {
        std::cout << "Default Hook Method" << std::endl;
    }
};

// 具体类A
class ConcreteClassA : public AbstractClass {
public:
    void primitiveOperation1() override {
        std::cout << "Concrete Class A - Primitive Operation 1" << std::endl;
    }

    void primitiveOperation2() override {
        std::cout << "Concrete Class A - Primitive Operation 2" << std::endl;
    }

    void hook() override {
        std::cout << "Concrete Class A - Custom Hook Method" << std::endl;
    }
};

// 具体类B
class ConcreteClassB : public AbstractClass {
public:
    void primitiveOperation1() override {
        std::cout << "Concrete Class B - Primitive Operation 1" << std::endl;
    }

    void primitiveOperation2() override {
        std::cout << "Concrete Class B - Primitive Operation 2" << std::endl;
    }
};

int main() {
    AbstractClass* objA = new ConcreteClassA();
    AbstractClass* objB = new ConcreteClassB();

    objA->templateMethod();
    std::cout << std::endl;
    objB->templateMethod();

    delete objB;
    delete objA;

    return 0;
}

4. Command(命令模式)

        命令模式是一种行为型设计模式,它将请求封装为一个对象,从而允许用不同的请求来参数化客户端对象,并且能够支持队列、日志和可撤销的操作。命令模式的核心思想是将请求的发送者和接收者解耦,使得请求发送者只需知道如何发送请求,而不需要知道接收者的具体操作

在 C++ 中,命令模式通常涉及以下几个角色:

        ①. Command(命令接口):定义了执行请求的接口,通常包含一个执行方法 execute()。

        ②. ConcreteCommand(具体命令类):实现了命令接口,负责执行具体的操作。

        ③. Receiver(接收者):负责实际执行命令的对象。

        ④. Invoker(调用者):持有命令对象,并在需要时调用命令对象的执行方法。

        以下是模式示例:

#include <iostream>

// 命令接口
class Command {
public:
    virtual void execute() = 0;
};

// 具体命令类A
class ConcreteCommandA : public Command {
private:
    std::string receiverState; // 接收者状态
    Receiver* receiver; // 接收者对象

public:
    ConcreteCommandA(Receiver* rec, const std::string& state) : receiver(rec), receiverState(state) {}

    void execute() override {
        std::cout << "Concrete Command A executed." << std::endl;
        receiver->action(receiverState);
    }
};

// 具体命令类B
class ConcreteCommandB : public Command {
private:
    Receiver* receiver; // 接收者对象

public:
    ConcreteCommandB(Receiver* rec) : receiver(rec) {}

    void execute() override {
        std::cout << "Concrete Command B executed." << std::endl;
        receiver->action("B");
    }
};

// 接收者
class Receiver {
public:
    void action(const std::string& state) {
        std::cout << "Receiver performing action with state: " << state << std::endl;
    }
};

// 调用者
class Invoker {
private:
    Command* command;

public:
    Invoker(Command* cmd) : command(cmd) {}

    void setCommand(Command* cmd) {
        command = cmd;
    }

    void executeCommand() {
        command->execute();
    }
};

int main() {
    Receiver receiver;
    ConcreteCommandA commandA(&receiver, "A");
    ConcreteCommandB commandB(&receiver);

    Invoker invoker(&commandA);
    invoker.executeCommand();

    invoker.setCommand(&commandB);
    invoker.executeCommand();

    return 0;
}

5. Chain of Responsibility(责任链模式)

        责任链模式是一种行为型设计模式,它允许将请求沿着处理链传递,并且在链上的每个处理者都有机会处理请求或将其传递给下一个处理者。这种模式可以避免请求发送者和接收者之间的直接耦合,并支持动态添加或修改处理者

        在 C++ 中,责任链模式通常涉及以下几个角色:

        ①. Handler(处理者接口):定义了处理请求的接口,并包含一个对下一个处理者的引用

        ②. ConcreteHandler(具体处理者类):实现了处理者接口,并对请求进行具体处理或将请求传递给下一个处理者

        以下是模式示例:

#include <iostream>

// 处理者接口
class Handler {
protected:
    Handler* nextHandler;

public:
    Handler() : nextHandler(nullptr) {}

    void setNextHandler(Handler* handler) {
        nextHandler = handler;
    }

    virtual void handleRequest(int request) = 0;
};

// 具体处理者A
class ConcreteHandlerA : public Handler {
public:
    void handleRequest(int request) override {
        if (request >= 0 && request < 10) {
            std::cout << "Concrete Handler A handles the request." << std::endl;
        } else if (nextHandler != nullptr) {
            nextHandler->handleRequest(request);
        }
    }
};

// 具体处理者B
class ConcreteHandlerB : public Handler {
public:
    void handleRequest(int request) override {
        if (request >= 10 && request < 20) {
            std::cout << "Concrete Handler B handles the request." << std::endl;
        } else if (nextHandler != nullptr) {
            nextHandler->handleRequest(request);
        }
    }
};

// 客户端
int main() {
    ConcreteHandlerA handlerA;
    ConcreteHandlerB handlerB;

    handlerA.setNextHandler(&handlerB);

    handlerA.handleRequest(5);
    handlerA.handleRequest(15);
    handlerA.handleRequest(25);

    return 0;
}

6. State(状态模式)

        状态模式是一种行为型设计模式,它允许对象在其内部状态发生改变时改变其行为,使得对象看起来好像修改了其类。状态模式将对象的行为封装在不同的状态类中,并将状态的改变委托给当前状态对象,从而实现了状态之间的切换和行为的动态变化

        在 C++ 中,状态模式通常涉及以下几个角色:

        ①. State(状态接口):定义了一个接口,用于封装与特定状态相关的行为。

        ②. ConcreteState(具体状态类):实现了状态接口,并实现了与特定状态相关的行为。

        ③. Context(上下文类):维护一个对当前状态对象的引用,并将状态的改变委托给当前状态对象

        以下是模式示例:

#include <iostream>

// 状态接口
class State {
public:
    virtual void handle() = 0;
};

// 具体状态类A
class ConcreteStateA : public State {
public:
    void handle() override {
        std::cout << "Concrete State A handled." << std::endl;
    }
};

// 具体状态类B
class ConcreteStateB : public State {
public:
    void handle() override {
        std::cout << "Concrete State B handled." << std::endl;
    }
};

// 上下文类
class Context {
private:
    State* currentState;

public:
    Context(State* initState) : currentState(initState) {}

    void setState(State* newState) {
        currentState = newState;
    }

    void request() {
        currentState->handle();
    }
};

int main() {
    ConcreteStateA stateA;
    ConcreteStateB stateB;

    Context context(&stateA);
    context.request();

    context.setState(&stateB);
    context.request();

    return 0;
}

7. Visitor(访问者模式)

        访问者模式是一种行为型设计模式,它能够在不改变元素类(数据结构)本身的前提下,定义作用于这些元素对象的新操作。访问者模式将数据结构与作用于数据结构上的操作解耦,使得操作可以独立变化,同时也增加了新操作的扩展性。

        在 C++ 中,访问者模式通常涉及以下几个角色:

        ①. Visitor(访问者接口):定义了对各种元素对象的访问操作

        ②. ConcreteVisitor(具体访问者类):实现了访问者接口,对每种元素对象的访问操作进行具体实现。

        ③. Element(元素接口):定义了接受访问者对象访问的方法。

        ④. ConcreteElement(具体元素类):实现了元素接口,并实现了接受访问者对象访问的方法。

        ⑤. ObjectStructure(对象结构):维护了一个元素对象的集合,并提供了遍历集合并接受访问者对象访问的方法

        以下是模式示例:

#include <iostream>
#include <vector>

// 前置声明
class ConcreteVisitor;

// 元素接口
class Element {
public:
    virtual void accept(ConcreteVisitor& visitor) = 0;
};

// 具体元素类A
class ConcreteElementA : public Element {
public:
    void accept(ConcreteVisitor& visitor) override;
    std::string operationA() const;
};

// 具体元素类B
class ConcreteElementB : public Element {
public:
    void accept(ConcreteVisitor& visitor) override;
    int operationB() const;
};

// 访问者接口
class Visitor {
public:
    // 定义了对各种元素对象的访问操作
    virtual void visit(ConcreteElementA& element) = 0;
    virtual void visit(ConcreteElementB& element) = 0;
};

// 具体访问者类
class ConcreteVisitor : public Visitor {
public:
    void visit(ConcreteElementA& element) override {
        std::cout << "Concrete Visitor visits " << element.operationA() << std::endl;
    }

    void visit(ConcreteElementB& element) override {
        std::cout << "Concrete Visitor visits " << element.operationB() << std::endl;
    }
};

// 具体元素A的接受访问者方法实现
void ConcreteElementA::accept(ConcreteVisitor& visitor) {
    visitor.visit(*this);
}

// 具体元素A的操作
std::string ConcreteElementA::operationA() const {
    return "Element A";
}

// 具体元素B的接受访问者方法实现
void ConcreteElementB::accept(ConcreteVisitor& visitor) {
    visitor.visit(*this);
}

// 具体元素B的操作
int ConcreteElementB::operationB() const {
    return 123;
}

// 对象结构类
class ObjectStructure {
private:
    std::vector<Element*> elements;

public:
    void addElement(Element* element) {
        elements.push_back(element);
    }

    void accept(ConcreteVisitor& visitor) {
        for (Element* element : elements) {
            element->accept(visitor);
        }
    }
};

int main() {
    ConcreteElementA elementA;
    ConcreteElementB elementB;

    ObjectStructure structure;
    structure.addElement(&elementA);
    structure.addElement(&elementB);

    ConcreteVisitor visitor;
    structure.accept(visitor);

    return 0;
}

8. Memento(备忘录模式)

        备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下捕获对象的内部状态,并在对象之外保存这个状态。备忘录模式通常用于需要记录和恢复对象状态的场景,比如撤销操作。

        在 C++ 中,备忘录模式通常涉及以下几个角色:

        ①. Originator(原发器):负责创建备忘录对象,并在需要时恢复对象状态

        ②. Memento(备忘录):用于存储原发器对象的内部状态,可以包含多个状态属性。

        ③. Caretaker(负责人):负责保存备忘录对象,但不应该修改备忘录对象的状态

        以下是模式示例:

#include <iostream>
#include <string>

// 备忘录类
class Memento {
private:
    std::string state;

public:
    Memento(const std::string& s) : state(s) {}

    std::string getState() const {
        return state;
    }
};

// 原发器类
class Originator {
private:
    std::string state;

public:
    void setState(const std::string& s) {
        state = s;
    }

    std::string getState() const {
        return state;
    }

    Memento createMemento() const {
        return Memento(state);
    }

    void restoreMemento(const Memento& m) {
        state = m.getState();
    }
};

// 负责人类
class Caretaker {
private:
    Memento memento;

public:
    void setMemento(const Memento& m) {
        memento = m;
    }

    Memento getMemento() const {
        return memento;
    }
};

int main() {
    Originator originator;
    Caretaker caretaker;

    // 设置原发器状态
    originator.setState("State 1");
    std::cout << "Current State: " << originator.getState() << std::endl;

    // 创建备忘录并保存
    caretaker.setMemento(originator.createMemento());

    // 修改原发器状态
    originator.setState("State 2");
    std::cout << "Modified State: " << originator.getState() << std::endl;

    // 恢复备忘录状态
    originator.restoreMemento(caretaker.getMemento());
    std::cout << "Restored State: " << originator.getState() << std::endl;

    return 0;
}

9. Mediator(中介者模式)

        中介者模式是一种行为型设计模式,它通过引入一个中介者对象来减少多个对象之间的直接通信,并且使得这些对象不需要显式地相互引用,从而降低了对象之间的耦合度。中介者模式通常用于处理多个对象之间的复杂交互关系,将这些关系集中管理,使得系统更易于维护和扩展。

在 C++ 中,中介者模式通常涉及以下几个角色:

        ①. Mediator(中介者接口):定义了各个同事对象之间通信的接口。

        ②. ConcreteMediator(具体中介者类):实现了中介者接口,并负责协调各个同事对象之间的通信

        ③. Colleague(同事类):定义了抽象同事类的接口,每个同事对象都应该持有一个对中介者对象的引用

        ④. ConcreteColleague(具体同事类):实现了同事类接口,并在需要时与中介者对象进行通信。

        以下是模式示例:

#include <iostream>
#include <string>

// 前置声明
class Colleague;

// 中介者接口
class Mediator {
public:
    virtual void sendMessage(const std::string& message, Colleague* colleague) = 0;
};

// 具体中介者类
class ConcreteMediator : public Mediator {
private:
    Colleague* colleagueA;
    Colleague* colleagueB;

public:
    void setColleagueA(Colleague* colleague) {
        colleagueA = colleague;
    }

    void setColleagueB(Colleague* colleague) {
        colleagueB = colleague;
    }

    void sendMessage(const std::string& message, Colleague* colleague) override {
        if (colleague == colleagueA) {
            colleagueB->receiveMessage(message);
        } else if (colleague == colleagueB) {
            colleagueA->receiveMessage(message);
        }
    }
};

// 同事类接口
class Colleague {
protected:
    Mediator* mediator;

public:
    Colleague(Mediator* med) : mediator(med) {}

    virtual void sendMessage(const std::string& message) = 0;
    virtual void receiveMessage(const std::string& message) = 0;
};

// 具体同事类A
class ConcreteColleagueA : public Colleague {
public:
    ConcreteColleagueA(Mediator* med) : Colleague(med) {}

    void sendMessage(const std::string& message) override {
        mediator->sendMessage(message, this);
    }

    void receiveMessage(const std::string& message) override {
        std::cout << "Concrete Colleague A received message: " << message << std::endl;
    }
};

// 具体同事类B
class ConcreteColleagueB : public Colleague {
public:
    ConcreteColleagueB(Mediator* med) : Colleague(med) {}

    void sendMessage(const std::string& message) override {
        mediator->sendMessage(message, this);
    }

    void receiveMessage(const std::string& message) override {
        std::cout << "Concrete Colleague B received message: " << message << std::endl;
    }
};

int main() {
    ConcreteMediator mediator;
    ConcreteColleagueA colleagueA(&mediator);
    ConcreteColleagueB colleagueB(&mediator);

    mediator.setColleagueA(&colleagueA);
    mediator.setColleagueB(&colleagueB);

    colleagueA.sendMessage("Hello from Colleague A");
    colleagueB.sendMessage("Hello from Colleague B");

    return 0;
}

10. Interpreter(解释器模式)

        解释器模式是一种行为型设计模式,它用于定义一个语言的文法,并提供一种解释器来解释该语言中的句子。解释器模式通常用于处理复杂的语法或规则,将这些语法或规则表示为一个抽象语法树,并通过解释器来执行对应的操作。

        在 C++ 中,解释器模式通常涉及以下几个角色:

        ①. AbstractExpression(抽象表达式):定义了一个抽象的解释操作,通常包含一个解释方法 interpret()

        ②. TerminalExpression(终结符表达式):实现了抽象表达式接口,并负责解释语言中的终结符。

        ③. NonterminalExpression(非终结符表达式):实现了抽象表达式接口,并负责解释语言中的非终结符,通常是一个复合表达式

        ④. Context(环境类):包含解释器需要的全局信息,通常由解释器来操作。

        以下是模式示例:

#include <iostream>
#include <string>
#include <unordered_map>

// 环境类
class Context {
private:
    std::unordered_map<std::string, int> variables;

public:
    void setVariable(const std::string& var, int value) {
        variables[var] = value;
    }

    int getVariable(const std::string& var) const {
        if (variables.find(var) != variables.end()) {
            return variables.at(var);
        }
        return 0; // 默认返回0
    }
};

// 抽象表达式类
class AbstractExpression {
public:
    virtual int interpret(Context& context) = 0;
};

// 终结符表达式类
class TerminalExpression : public AbstractExpression {
private:
    std::string variable;

public:
    TerminalExpression(const std::string& var) : variable(var) {}

    int interpret(Context& context) override {
        return context.getVariable(variable);
    }
};

// 非终结符表达式类
class NonterminalExpression : public AbstractExpression {
private:
    AbstractExpression* expressionA;
    AbstractExpression* expressionB;

public:
    NonterminalExpression(AbstractExpression* expA, AbstractExpression* expB)
        : expressionA(expA), expressionB(expB) {}

    int interpret(Context& context) override {
        return expressionA->interpret(context) + expressionB->interpret(context);
    }
};

int main() {
    Context context;
    context.setVariable("a", 5);
    context.setVariable("b", 10);

    AbstractExpression* expression = new NonterminalExpression(
        new TerminalExpression("a"), new TerminalExpression("b"));

    int result = expression->interpret(context);
    std::cout << "Result: " << result << std::endl;

    delete expression;

    return 0;
}

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

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

相关文章

数据结构复习指导之图的遍历

文章目录 图的遍历 考纲内容 复习提示 1.广度优先搜索 1.1BFS算法的性能分析 1.2BFS算法求解单源最短路径问题 1.3广度优先生成树 2.深度优先搜索 2.1DFS算法的性能分析 2.2深度优先的生成树和生成森林 3.图的遍历与图的连通性 4.知识回顾 图的遍历 考纲内容 &…

Signal 即将成为JavaScript的一部分

什么是响应性&#xff1f; 在过去的几年中&#xff0c;响应性成为了所有现代前端框架以及React库的核心。 对于不熟悉前端开发的人来说&#xff0c;起初这可能是一个令人困惑的概念&#xff0c;因为它改变了常规的、自上而下的、从调用者到被调用者的顺序工作流。 在响应性范…

GIT基础02 多机器协作等命令

前言 首先我们知道git给我们提供了分支管理的功能 我们一般使用master分支作为线上环境,master分支一般是一个稳定的分支 我们通常是会创建一个其他分支进行开发,这样不会影响线上的机器运行 如果没有git提供这样的分支功能,就无法做到这一套了 指令学习 假设软件出现问题咋办…

得物质量管理体系的建设与应用

一、背景 质量保障是一门基于软件测试的系统化工程&#xff0c;遵循渐进式的发展规律。通过因地制宜地制定落地策略&#xff0c;设计场景方案&#xff0c;获取试验结果&#xff0c;并加以循环往复。最终&#xff0c;在每一位得物测试工程师的共同努力下&#xff0c;积累出一套…

Moe 混合多专家模型 原理 + 大模型的有性繁殖

Moe 混合多专家模型 原理 大模型的有性繁殖 MoE 介绍标准 Transformer 编码器MoE Transformer 编码器专家网络层 大模型的有性繁殖mergekit 合并 多个专家模型 的方式1. SLERP&#xff08;球面线性插值&#xff09;2. TIES3. DARE4. Passthrough5. Linear mergekit 合并 多个专…

vue3中实现简繁体转换

由于项目在大陆和台湾同胞同步使用&#xff0c;因此需要实现中文的简繁体转换&#xff0c;实现输入简体&#xff0c;能搜索出简体和繁体的相关内容&#xff0c;输入繁体&#xff0c;也能搜索出简繁体相关内容。忽略简繁体&#xff0c;扩大搜索范围。 引入插件&#xff1a; np…

一休:一款专业的休息提醒软件

对于长期使用电子产品的人来说&#xff0c;保护眼睛至关重要&#xff0c;不论是工作还是学习&#xff0c;适当的休息都是必要的&#xff0c;保护视力要牢记20-20-20法则&#xff0c;眼科医生陶勇也科普过&#xff1a; 使用电脑工作和学习时&#xff0c;容易会忘记时间&#x…

在面对各种问题时,我们应该如何进行数据分析

python数据分析汇总 前言一、对比分析概念特征类型案例Matplotlib的颜色字母对照表解决遇到未知函数 二、相关性分析概念类型案例一案例二 三、时间序列分析概念类型案例 四、回归分析概念类型案例一案例二案例三 五、决策树概念计算过程案例 六、主成分分析概念计算过程案例 七…

【手势识别-UILongPressGestureRecognizer长按 Objective-C语言】

一、我们来说这个长按啊, 1.长按这个手势,也是,步骤都是一样的,首先,也是这三大步啊, 1)创建手势对象 2)对某一个view添加手势 3)实现手势的方法 首先,也是三大步, 1)创建手势对象:首先,你要告诉我,你要使用哪一个手势,我要使用一个叫做UILongPressGesture…

[牛客网]——C语言刷题day4

答案&#xff1a;B 解析&#xff1a; a是数组首元素的地址,a1的步长是int&#xff0c;所以是2 &a是数组的首地址&#xff0c;&a1步长是int[5] ptr是int类型的指针&#xff0c;指向a数组的尾后位置&#xff0c;ptr-1的步长是int,所以是a数组的最后一个元素5 答案&am…

【无标题】海图微电子产品

一、HT2300 1、产品介绍 HT2300在全分辨率 (1920 H 1080 V) 下&#xff0c;它们的帧率可达2500fps。加上全局快门像素和低噪声等特性&#xff0c;可满足对高分辨率&#xff0c;高速CMOS图像传感器的需求&#xff0c;适用于科学研究&#xff0c;工业检测和数字影视中高速视频捕捉…

WebRTC实时音视频通话之语音通话设计与实践

一、背景 在移动互联网流量时代&#xff0c;很多业务场景都有音视频通信的需求&#xff0c;比如IM场景&#xff0c;除了文字交流还需要音视频通话进行实时交互。为了帮助58、赶集、安居客等业务线更好的为用户提供服务&#xff0c;节约沟通成本&#xff0c;提升效率&#xff0…

HNU-算法设计与分析-作业5

第五次作业【回溯算法】 文章目录 第五次作业【回溯算法】<1> 算法分析题5-3 回溯法重写0-1背包<2> 算法分析题5-5 旅行商问题&#xff08;剪枝&#xff09;<3> 算法实现题5-2 最小长度电路板排列问题<4> 算法实现题5-7 n色方柱问题<5> 算法实现…

最近很火的粘土滤镜被玩坏了,教你用AI绘画SD免费无限制使用,附教程!

大家好&#xff0c;我是阿威。 最近在小红书上&#xff0c;“粘土特效”、“粘土滤镜”异常爆火&#xff0c;被网友玩出了花。 原来&#xff0c;一款海外修图工具——Remini&#xff08;类似妙鸭相机&#xff09;上线AI滤镜功能&#xff0c;其中就包括粘土滤镜&#xff0c;非常…

WPS如何把多个表格合并到一个表格里面?

注意&#xff1a;此功能需要wps会员。 例如&#xff1a;这里有3个表格。 现在希望合并3个表格到一起&#xff0c;如下图所示。 新建一个表格&#xff0c;打开表格。 选择 开始->工作表->合并表格->整合成为一个工作薄。 弹出对话框&#xff0c;选择添加文件&#xff…

Pencils Protocol Season 2 收官在即,Season 3 携系列重磅权益来袭

此前Scroll生态LaunchPad &聚合收益平台Pencils Protocol&#xff08;原Penpad&#xff09;&#xff0c;推出了首个资产即其生态代币PDD的Launch&#xff0c;Season 2活动主要是用户通过质押ETH代币、组件战队等方式&#xff0c;来获得Point奖励&#xff0c;并以该Point为依…

剪辑师创作必备声音素材,BGM背景音效素材合集1万款

一、素材描述 本套音效包含了全面丰富的声音效果&#xff0c;如动物、运输、人群、天气、航空、军事、Foley声音等&#xff0c;以及世界各地的场景声效等&#xff0c;可能是同类音效中最为全面的&#xff0c;共由三套声音素材组合而成&#xff0c;1、熊猫背景音乐3800首&#…

Java数据类型:引用类型

Java的数据类型可以分为基本数据类型(8种)和引用类型。 本文将深入探讨引用类型的概念、使用方法、工作原理&#xff0c;并通过代码示例加以说明&#xff0c;帮助读者全面理解这一Java编程的核心要素。 1. 引用类型的定义 引用类型&#xff0c;顾名思义&#xff0c;是用于存…

2024年抖店保证金交多少?保证金常见问题解答,一文解决你所有疑惑

大家好&#xff0c;我是电商花花 新手如果想要开抖音小店&#xff0c;有一个大坑是必须要避开的。 就是我们店铺开通之后&#xff0c;我们一定要交保证金&#xff0c;如果不交&#xff0c;那就是0元开店。 很多新手听别人说做抖音小店可以0元开店&#xff0c;不用缴纳保证金就…

亚马逊测评真人号与自养号:如何选择?区别与作用全面解析

亚马逊卖家都希望能打造出热销产品的产品列表&#xff0c;因为评论对于列表的曝光和流量有着巨大的影响。然而&#xff0c;获取有效的产品评论并不容易&#xff0c;许多卖家为了提高自己产品在同类别中的竞争力&#xff0c;选择进行测评。测评可以快速提高产品的排名、权重和销…