久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

嵌入式開發(fā)必殺技:策略模式實(shí)戰(zhàn)指南,告別if-else地獄!

上一篇我們分享了bufferevent | 嵌入式網(wǎng)絡(luò)通信緩沖層,其中bufferevent 采用了 策略模式 設(shè)計(jì),通過 struct bufferevent_ops 實(shí)現(xiàn)多態(tài)行為:

不同類型的 bufferevent(如 socket、filter、SSL)共享同一套接口,通過 be_ops 指針調(diào)用各自的實(shí)現(xiàn)函數(shù)。

這篇文章我們來分享策略模式相關(guān)的內(nèi)容:

策略模式

策略模式(Strategy Pattern)是一種行為設(shè)計(jì)模式,它定義了一系列算法,并將每個(gè)算法封裝成獨(dú)立的對(duì)象,使它們可以相互替換。這種模式讓算法的變化獨(dú)立于使用算法的客戶端。

策略模式包含以下主要角色:

  1. 上下文(Context):持有一個(gè)策略對(duì)象的引用,用于調(diào)用策略。
  2. 策略接口(Strategy):定義所有支持的算法或行為的公共接口。
  3. 具體策略(Concrete Strategies):實(shí)現(xiàn)策略接口的具體類,提供具體的算法實(shí)現(xiàn)。

在嵌入式系統(tǒng)中,該模式尤其適用于:

  1. 通信協(xié)議切換:在UART/I2C/SPI之間動(dòng)態(tài)切換
  2. 傳感器數(shù)據(jù)處理:針對(duì)不同傳感器類型(溫度/濕度/光感)使用不同處理策略
  3. 電源管理:根據(jù)電源狀態(tài)(電池/外接電源)切換功耗策略
  4. 控制算法:在PID控制、模糊控制等算法間動(dòng)態(tài)切換

策略模式 vs 非策略模式:

嵌入式應(yīng)用案例

傳感器數(shù)據(jù)處理:針對(duì)不同傳感器類型(溫度/濕度)使用不同處理策略。

代碼實(shí)現(xiàn):

1、上下文(Context):

// 傳感器處理器(上下文)
typedef struct {
    SensorStrategy strategy;
    void* sensor_data;
} SensorProcessor;

2、策略接口(Strategy):

// 策略接口
typedef void (*SensorStrategy)(void* data);

3、具體策略(Concrete Strategies):

// 溫度傳感器策略
void temperature_strategy(void* data) {
    float* temp = (float*)data;
    printf("[C] Processing temperature: %.1fC -> Calibrated: %.1fC\n", 
           *temp, *temp + 0.5f);
}

// 濕度傳感器策略
void humidity_strategy(void* data) {
    int* humidity = (int*)data;
    printf("[C] Processing humidity: %d%% -> Adjusted: %d%%\n", 
           *humidity, *humidity + 2);
}

C語言完整例子:

#include 

// 策略接口
typedef void (*SensorStrategy)(void* data);

// 溫度傳感器策略
void temperature_strategy(void* data) {
    float* temp = (float*)data;
    printf("[C] Processing temperature: %.1fC -> Calibrated: %.1fC\n", 
           *temp, *temp + 0.5f);
}

// 濕度傳感器策略
void humidity_strategy(void* data) {
    int* humidity = (int*)data;
    printf("[C] Processing humidity: %d%% -> Adjusted: %d%%\n", 
           *humidity, *humidity + 2);
}

// 傳感器處理器(上下文)
typedefstruct {
    SensorStrategy strategy;
    void* sensor_data;
} SensorProcessor;

void process_sensor(SensorProcessor* processor) {
    processor->strategy(processor->sensor_data);
}

int main(void) {
    printf("\n--- Strategy Pattern Demo ---\n");
    
    float temp_data = 25.3f;
    int humidity_data = 45;
    
    SensorProcessor temp_processor = {temperature_strategy, &temp_data};
    SensorProcessor hum_processor = {humidity_strategy, &humidity_data};
    
    process_sensor(&temp_processor);
    process_sensor(&hum_processor);
    
    return0;
}

C++完整例子:

#include 
#include 

// 策略接口
class SensorStrategy {
public:
    virtual void process() = 0;
    virtual ~SensorStrategy() = default;
};

// 溫度傳感器策略
class TemperatureStrategy :public SensorStrategy {
public:
    explicit TemperatureStrategy(float temp) : temp_(temp) {}
    void process() override {
        std::cout << "Processing temperature: " << temp_
                  << "C -> Calibrated: " << temp_ + 0.5f << "C\n";
    }
private:
    float temp_;
};

// 濕度傳感器策略
class HumidityStrategy :public SensorStrategy {
public:
    explicit HumidityStrategy(int humidity) : humidity_(humidity) {}
    void process() override {
        std::cout << "Processing humidity: " << humidity_
                  << "% -> Adjusted: " << humidity_ + 2 << "%\n";
    }
private:
    int humidity_;
};

// 傳感器處理器(上下文)
class SensorProcessor {
public:
    void set_strategy(std::unique_ptr strategy) {
        strategy_ = std::move(strategy);
    }
    
    void process_sensor() {
        if(strategy_) strategy_->process();
    }
private:
    std::unique_ptr strategy_;
};

int main(void) {
    std::cout << "\n--- Strategy Pattern Demo ---\n";
    
    SensorProcessor processor;
    
    processor.set_strategy(std::make_unique(25.3f));
    processor.process_sensor();
    
    processor.set_strategy(std::make_unique(45));
    processor.process_sensor();
    
    return0;
}

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  1. 開閉原則:無需修改上下文即可引入新策略
  2. 消除條件分支:替代復(fù)雜的if-else/switch語句
  3. 關(guān)注點(diǎn)分離:算法實(shí)現(xiàn)與使用邏輯解耦

缺點(diǎn):

  1. 對(duì)象數(shù)量增加:每個(gè)策略都是獨(dú)立類/對(duì)象
  2. 客戶端認(rèn)知負(fù)擔(dān):需了解不同策略的差異
  3. 過度設(shè)計(jì)風(fēng)險(xiǎn):簡(jiǎn)單算法可能不需要策略模式

嵌入式場(chǎng)景適用性總結(jié)

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關(guān)注 33
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧