国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ 程序設(shè)計(jì):四大模式(工廠+裝飾+策略+觀察者)

這篇具有很好參考價(jià)值的文章主要介紹了C++ 程序設(shè)計(jì):四大模式(工廠+裝飾+策略+觀察者)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.前言

"工廠+裝飾+策略+觀察者"是常見(jiàn)且常用的設(shè)計(jì)模式之一,但并不是指稱"四大模式"的官方術(shù)語(yǔ)。

"四大模式"通常是指指令式面向?qū)ο缶幊讨械乃膫€(gè)基本概念:封裝繼承、多態(tài)抽象。這四個(gè)概念是面向?qū)ο缶幊痰幕?/p>

2.工廠模式

工廠模式(例:工廠方法模式)中,通常存在一個(gè)抽象的工廠類和多個(gè)具體的工廠子類。每個(gè)工廠子類負(fù)責(zé)創(chuàng)建一種具體的對(duì)象,具體的創(chuàng)建邏輯在工廠子類中實(shí)現(xiàn)。客戶端通過(guò)與工廠接口進(jìn)行交互,并由工廠子類來(lái)創(chuàng)建所需的對(duì)象。

/* 將工廠也聲明成一個(gè)基類 */             
class TaskBase
{
public:
    TaskBase();
    virtual ~CalculatorBase();
    virtual void exec(unsigned char *data) = 0; 
private:
    ...
};

class TaskA : public TaskBase
{
public:
    TaskA();
    ~TaskA();
    virtual void exec(unsigned char *data) override;
private:
    ...
};

class TaskB : public TaskBase
{
public:
    TaskA();
    ~TaskB();
    virtual void exec(unsigned char *data) override;
private:
    ...
};

int main() 
{
    TaskBase *task_1 = new TaskA();
    TaskBase *task_2 = new TaskB();
    TaskBase *current;
    
    int type = 1; // 進(jìn)行工廠的選擇
    
    if(type == 0)
        current = task_1;
    else
        current = task_2;

    current->exec();

    return 0;
}

這種模式特別適合task任務(wù)的選擇?

3.裝飾模式

裝飾器模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,用于動(dòng)態(tài)地給對(duì)象添加額外的行為,同時(shí)又不修改原始對(duì)象的結(jié)構(gòu)。裝飾器模式通過(guò)將對(duì)象包裝在一個(gè)具有相同接口的裝飾器類中,可以在運(yùn)行時(shí)添加、修改或刪除對(duì)象的功能。

裝飾器模式的核心思想是使用繼承和組合,通過(guò)創(chuàng)建具有相同接口的裝飾器類來(lái)包裝原始對(duì)象。裝飾器類擁有與原始對(duì)象相同的接口,并持有一個(gè)指向原始對(duì)象的引用。裝飾器類可以在執(zhí)行原始對(duì)象的方法前后添加自定義的行為,以擴(kuò)展原始對(duì)象的功能。

#include <iostream>
#include <string>

// 抽象訂單接口
class Order 
{
public:
    virtual void process() = 0;
};

// 具體訂單類
class SimpleOrder : public Order 
{
public:
    void process() override 
    {
        std::cout << "處理簡(jiǎn)單訂單" << std::endl;
    }
};

// 抽象裝飾器類
class OrderDecorator : public Order 
{
protected:
    Order* decoratedOrder;  // 持有一個(gè)指向原始訂單的引用

public:
    OrderDecorator(Order* order) : decoratedOrder(order) {}

    void process() override 
    {
        decoratedOrder->process();
    }
};

// 具體裝飾器類A
class UrgentOrderDecorator : public OrderDecorator 
{
public:
    UrgentOrderDecorator(Order* order) : OrderDecorator(order) {}

    void process() override 
    {
        OrderDecorator::process();
        std::cout << "添加急件處理" << std::endl;
    }
};

// 具體裝飾器類B
class InternationalOrderDecorator : public OrderDecorator 
{
public:
    InternationalOrderDecorator(Order* order) : OrderDecorator(order) {}

    void process() override
    {
        OrderDecorator::process();
        std::cout << "添加國(guó)際訂單處理" << std::endl;
    }
};

int main() 
{
    Order* order = new SimpleOrder();
    order->process();  // 處理簡(jiǎn)單訂單

    Order* urgentOrder = new UrgentOrderDecorator(order);
    urgentOrder->process();  // 處理簡(jiǎn)單訂單,并添加急件處理

    Order* internationalOrder = new InternationalOrderDecorator(order);
    internationalOrder->process();  // 處理簡(jiǎn)單訂單,并添加國(guó)際訂單處理

    Order* urgentInternationalOrder = new UrgentOrderDecorator(new InternationalOrderDecorator(order));
    urgentInternationalOrder->process();  // 處理簡(jiǎn)單訂單,并同時(shí)添加國(guó)際訂單和急件處理

    delete urgentInternationalOrder;
    delete internationalOrder;
    delete urgentOrder;
    delete order;

    return 0;
}

在這個(gè)例子中,抽象訂單接口Order定義了訂單的處理方法process()。SimpleOrder是具體訂單類,它實(shí)現(xiàn)了訂單的處理邏輯。OrderDecorator是抽象裝飾器類,它持有一個(gè)指向原始訂單的引用,并在訂單處理前后添加額外的功能。UrgentOrderDecoratorInternationalOrderDecorator是具體裝飾器類,分別給訂單添加了急件處理和國(guó)際訂單處理。

客戶端代碼演示了不同的訂單處理情況。通過(guò)創(chuàng)建不同的裝飾器對(duì)象來(lái)包裝原始訂單對(duì)象,可以在處理訂單時(shí)添加額外的功能。每個(gè)裝飾器類都在執(zhí)行原始訂單的處理方法前后添加了自己特定的行為。

這個(gè)例子展示了裝飾器模式的靈活性,可以在不修改訂單類的情況下,動(dòng)態(tài)地添加、修改或刪除訂單的功能。它允許通過(guò)裝飾器組合來(lái)創(chuàng)建不同的訂單處理方式。

處理簡(jiǎn)單訂單

處理簡(jiǎn)單訂單
添加急件處理

處理簡(jiǎn)單訂單
添加國(guó)際訂單處理

處理簡(jiǎn)單訂單
添加國(guó)際訂單處理
添加急件處理
處理簡(jiǎn)單訂單
添加急件處理
添加國(guó)際訂單處理

?4.策略模式

C++策略模式(Strategy Pattern)是一種行為設(shè)計(jì)模式,它允許在運(yùn)行時(shí)動(dòng)態(tài)地選擇算法或行為。該模式將算法封裝在獨(dú)立的策略類中,使得它們可以相互替換,而不影響客戶端代碼。這種靈活性使得我們可以根據(jù)不同的情境選擇不同的算法,提高代碼的復(fù)用性和可維護(hù)性。?

#include <iostream>

// 定義抽象策略接口
class SendStrategy 
{
public:
    virtual void sendData(const std::string& data) const = 0;
};

// 定義具體策略類:UART發(fā)送
class UartStrategy : public SendStrategy 
{
public:
    void sendData(const std::string& data) const override 
    {
        std::cout << "UART發(fā)送數(shù)據(jù):" << data << std::endl;
    }
};

// 定義具體策略類:TCP發(fā)送
class TcpStrategy : public SendStrategy 
{
public:
    void sendData(const std::string& data) const override 
    {
        std::cout << "TCP發(fā)送數(shù)據(jù):" << data << std::endl;
    }
};

// 定義具體策略類:UDP發(fā)送
class UdpStrategy : public SendStrategy 
{
public:
    void sendData(const std::string& data) const override 
    {
        std::cout << "UDP發(fā)送數(shù)據(jù):" << data << std::endl;
    }
};

// 定義環(huán)境類
class DataSender {
private:
    SendStrategy* strategy;

public:
    explicit DataSender(SendStrategy* strategy) : strategy(strategy) {}

    void setStrategy(SendStrategy* strategy) 
    {
        this->strategy = strategy;
    }

    void sendData(const std::string& data) 
    {
        if (strategy) 
        {
            strategy->sendData(data);
        }
    }
};

int main() 
{
    // 創(chuàng)建具體策略對(duì)象
    SendStrategy* uart = new UartStrategy();
    SendStrategy* tcp = new TcpStrategy();
    SendStrategy* udp = new UdpStrategy();

    // 創(chuàng)建環(huán)境對(duì)象并設(shè)置初始策略
    DataSender sender(uart);

    // 發(fā)送數(shù)據(jù)
    sender.sendData("Hello, World!");

    // 切換為TCP發(fā)送
    sender.setStrategy(tcp);
    sender.sendData("Hello, TCP!");

    // 切換為UDP發(fā)送
    sender.setStrategy(udp);
    sender.sendData("Hello, UDP!");

    // 釋放資源
    delete uart;
    delete tcp;
    delete udp;

    return 0;
}

我們首先定義了一個(gè)抽象策略接口SendStrategy,然后實(shí)現(xiàn)了三個(gè)具體的策略類UartStrategy、TcpStrategyUdpStrategy,分別用于UART、TCP和UDP發(fā)送。

接著,我們定義了環(huán)境類DataSender,它維護(hù)了一個(gè)指向具體策略對(duì)象的引用,并提供了一個(gè)公共接口sendData()以供客戶端代碼調(diào)用。

在主函數(shù)中,我們創(chuàng)建了具體策略對(duì)象,并將初始策略設(shè)置為UART發(fā)送。然后,我們使用環(huán)境對(duì)象的sendData()方法來(lái)發(fā)送數(shù)據(jù)。

接著,我們切換策略為TCP發(fā)送和UDP發(fā)送,并分別調(diào)用環(huán)境對(duì)象的sendData()方法。

5.觀察者模式

C++觀察者模式(Observer Pattern)是一種行為設(shè)計(jì)模式,它使用一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象(主題)的狀態(tài)發(fā)生變化時(shí),自動(dòng)通知并更新其他依賴于它的對(duì)象(觀察者)。觀察者模式提供了一種松耦合的方式,使得主題和觀察者可以獨(dú)立變化,而不需要相互了解具體的實(shí)現(xiàn)細(xì)節(jié)。

觀察者模式的主要角色包括:

  1. Subject(主題):它通常是一個(gè)抽象類或接口,定義了增加、刪除和通知觀察者的方法。
  2. ConcreteSubject(具體主題):它是主題的具體實(shí)現(xiàn),存儲(chǔ)了具體觀察者對(duì)象,并在狀態(tài)發(fā)生變化時(shí)通知觀察者。
  3. Observer(觀察者):它定義了觀察者接收通知并更新自己的方法。
  4. ConcreteObserver(具體觀察者):它是觀察者的具體實(shí)現(xiàn),實(shí)現(xiàn)了接收通知和更新自身的方法。
#include <iostream>
#include <vector>

// 定義觀察者接口
class Observer {
public:
    virtual void update(const std::string& news) = 0;
};

// 定義具體觀察者類
class Subscriber : public Observer {
private:
    std::string name;

public:
    explicit Subscriber(const std::string& name) : name(name) {}

    void update(const std::string& news) override {
        std::cout << name << " 收到新聞:" << news << std::endl;
    }
};

// 定義主題類
class NewsChannel {
private:
    std::vector<Observer*> observers;
    std::string latestNews;

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

    void removeObserver(Observer* observer) {
        // 在實(shí)際應(yīng)用中可能需要實(shí)現(xiàn)刪除觀察者的邏輯
    }

    void notifyObservers() {
        for (auto observer : observers) {
            observer->update(latestNews);
        }
    }

    void setNews(const std::string& news) {
        latestNews = news;
        notifyObservers();
    }
};

int main() {
    // 創(chuàng)建主題類(新聞?lì)l道)
    NewsChannel newsChannel;

    // 創(chuàng)建觀察者類(訂閱者)
    Observer* subscriber1 = new Subscriber("訂閱者1");
    Observer* subscriber2 = new Subscriber("訂閱者2");

    // 添加觀察者到主題中
    newsChannel.addObserver(subscriber1);
    newsChannel.addObserver(subscriber2);

    // 發(fā)布新聞
    newsChannel.setNews("今天天氣晴朗,適合出游!");

    // 釋放資源
    delete subscriber1;
    delete subscriber2;

    return 0;
}

拓展:委托機(jī)制下的觀察者模式文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-584070.html

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>

// 定義一個(gè)委托類
template<typename... Args>
class Delegate {
public:
    using FunctionPtr = std::function<void(Args...)>;

    void Add(FunctionPtr function) {
        std::lock_guard<std::mutex> lock(mutex);
        delegates.push_back(function);
    }

    void Remove(FunctionPtr function) {
        std::lock_guard<std::mutex> lock(mutex);
        delegates.erase(std::remove(delegates.begin(), delegates.end(), function), delegates.end());
    }

    void Invoke(Args... args) {
        std::lock_guard<std::mutex> lock(mutex);
        for (auto delegate : delegates) {
            delegate(args...);
        }
    }

private:
    std::vector<FunctionPtr> delegates;
    std::mutex mutex;
};

// 定義觀察者基類
class Observer {
public:
    virtual void Notify() = 0;
};

// 定義具體觀察者類
class ConcreteObserver : public Observer {
public:
    ConcreteObserver(Delegate<void>& delegate) : delegate(delegate) {}

    void Notify() override {
        // 當(dāng)前線程接收到通知后的處理代碼
        std::cout << "ConcreteObserver received notification in thread: " << std::this_thread::get_id() << std::endl;
    }

private:
    Delegate<void>& delegate;
};

// 定義主題類
class Subject {
public:
    void AddObserver(Observer* observer) {
        std::lock_guard<std::mutex> lock(mutex);
        observers.push_back(observer);
    }

    void RemoveObserver(Observer* observer) {
        std::lock_guard<std::mutex> lock(mutex);
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    void NotifyObservers() {
        std::lock_guard<std::mutex> lock(mutex);
        for (auto observer : observers) {
            observer->Notify();
        }
    }

private:
    std::vector<Observer*> observers;
    std::mutex mutex;
};

// 工作線程函數(shù)
void WorkerThread(Subject& subject) {
    // 在工作線程中執(zhí)行一些任務(wù)...
    // 完成后通知觀察者
    std::this_thread::sleep_for(std::chrono::seconds(2)); // 模擬工作
    subject.NotifyObservers();
}

int main() {
    // 創(chuàng)建委托對(duì)象
    Delegate<void> delegate;

    // 創(chuàng)建觀察者對(duì)象
    ConcreteObserver observer(delegate);

    // 創(chuàng)建主題對(duì)象
    Subject subject;

    // 將觀察者注冊(cè)到主題中
    subject.AddObserver(&observer);

    // 創(chuàng)建工作線程并傳遞主題對(duì)象
    std::thread workerThread(WorkerThread, std::ref(subject));

    // 主線程中執(zhí)行其他任務(wù)
    std::cout << "Main thread doing some work..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));

    // 等待工作線程結(jié)束
    workerThread.join();

    return 0;
}

到了這里,關(guān)于C++ 程序設(shè)計(jì):四大模式(工廠+裝飾+策略+觀察者)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python---閉包,裝飾器,設(shè)計(jì)模式之工廠模式

    Python---閉包,裝飾器,設(shè)計(jì)模式之工廠模式

    1.? 閉包定義 定義雙層嵌套函數(shù), 內(nèi)層函數(shù)可以訪問(wèn)外層函數(shù)的變量 將內(nèi)存函數(shù)作為外層函數(shù)的返回,此內(nèi)層函數(shù)就是閉包函數(shù) 2. 閉包的好處和缺點(diǎn) 優(yōu)點(diǎn):不定義全局變量,也可以讓函數(shù)持續(xù)訪問(wèn)和修改一個(gè)外部變量 優(yōu)點(diǎn):閉包函數(shù)引用的外部變量,是外層函數(shù)的內(nèi)部變

    2024年02月02日
    瀏覽(23)
  • 【設(shè)計(jì)模式與范式:行為型】61 | 策略模式(下):如何實(shí)現(xiàn)一個(gè)支持給不同大小文件排序的小程序?

    上一節(jié)課,我們主要介紹了策略模式的原理和實(shí)現(xiàn),以及如何利用策略模式來(lái)移除 if-else 或者 switch-case 分支判斷邏輯。今天,我們結(jié)合“給文件排序”這樣一個(gè)具體的例子,來(lái)詳細(xì)講一講策略模式的設(shè)計(jì)意圖和應(yīng)用場(chǎng)景。 除此之外,在今天的講解中,我還會(huì)通過(guò)一步一步地

    2024年02月10日
    瀏覽(19)
  • 設(shè)計(jì)模式(單例模式、工廠模式及適配器模式、裝飾器模式)

    設(shè)計(jì)模式(單例模式、工廠模式及適配器模式、裝飾器模式)

    目錄 0 、設(shè)計(jì)模式簡(jiǎn)介 一、單例模式 二、工廠模式 三、適配器模式 四、裝飾器模式? 設(shè)計(jì)模式可以分為以下三種:? 創(chuàng)建型模式: 用來(lái)描述 “如何創(chuàng)建對(duì)象” ,它的主要特點(diǎn)是 “將對(duì)象的創(chuàng)建和使用分離”。包括 單例 、原型、 工廠方法 、 抽象工廠 和建造者 5 種模式。

    2024年02月06日
    瀏覽(19)
  • 軟件設(shè)計(jì)模式(二):工廠、門面、調(diào)停者和裝飾器模式

    軟件設(shè)計(jì)模式(二):工廠、門面、調(diào)停者和裝飾器模式

    ????????在這篇文章中,荔枝將會(huì)梳理軟件設(shè)計(jì)模式中的四種:工廠模式、Facade模式、Mediator模式和裝飾器Decorator模式。其中比較重要的就是工廠模式和裝飾器模式,工廠模式在開(kāi)發(fā)中使用的頻數(shù)比較高。希望荔枝的這篇文章能講清楚哈哈哈哈,希望能幫助到有需要的小伙

    2024年02月09日
    瀏覽(22)
  • 設(shè)計(jì)模式-策略工廠

    設(shè)計(jì)模式-策略工廠

    在介紹策略工廠的實(shí)現(xiàn)前,我們要先了解spring中beanFactory: BeanFactory 作為IOC服務(wù)的提供者,通過(guò)XmlBeanFactory來(lái)得到實(shí)例 生產(chǎn)Bean的工廠,采用延遲初始化策略(只有在需要某個(gè)對(duì)象時(shí),才進(jìn)行初始化和依賴注入); 通常會(huì)用xml文件來(lái)注冊(cè)并管理各個(gè)業(yè)務(wù)對(duì)象之間的依賴關(guān)系

    2024年02月11日
    瀏覽(20)
  • 設(shè)計(jì)模式:策略模式和工廠模式混合使用

    有時(shí)單個(gè)設(shè)計(jì)模式并不能滿足我們的業(yè)務(wù)需求,這個(gè)時(shí)候就要根據(jù)具體的業(yè)務(wù)來(lái)混合使用設(shè)計(jì)模式,其中策略模式和工廠模式是比較常用的一個(gè)組合。工廠模式可以管理具體策略的生命周期,策略模式可以豐滿具體細(xì)節(jié)的邏輯。 在這個(gè)示例中,我們定義了一個(gè)策略接口和兩個(gè)

    2024年02月07日
    瀏覽(23)
  • Java 大廠八股文面試專題-設(shè)計(jì)模式 工廠方法模式、策略模式、責(zé)任鏈模式

    Java 大廠八股文面試專題-設(shè)計(jì)模式 工廠方法模式、策略模式、責(zé)任鏈模式

    ????????在平時(shí)的開(kāi)發(fā)中,涉及到設(shè)計(jì)模式的有兩塊內(nèi)容,第一個(gè)是我們 平時(shí)使用的框架 (比如spring、mybatis等),第二個(gè)是我們自己開(kāi)發(fā)業(yè)務(wù)使用的設(shè)計(jì)模式。 ????????面試官一般比較關(guān)心的是你在開(kāi)發(fā)過(guò)程中, 有沒(méi)有使用過(guò)設(shè)計(jì)模式,或者你在簡(jiǎn)歷上寫(xiě)了關(guān)于設(shè)計(jì)

    2024年02月10日
    瀏覽(29)
  • 【C++設(shè)計(jì)模式】詳解裝飾模式

    【C++設(shè)計(jì)模式】詳解裝飾模式

    2023年8月31日,周四上午 這是我目前碰到的最難的設(shè)計(jì)模式..... 非常難以理解而且比較靈活多半,學(xué)得賊難受,寫(xiě)得賊費(fèi)勁..... 2023年8月31日,周四晚上19:48 終于寫(xiě)完了,花了一天的時(shí)間來(lái)學(xué)習(xí)裝飾模式和寫(xiě)這篇博客。 雖然基本上把我今天的收獲都寫(xiě)下來(lái)了, 但感覺(jué)寫(xiě)得還是

    2024年02月10日
    瀏覽(27)
  • C++設(shè)計(jì)模式:裝飾器模式(四)

    C++設(shè)計(jì)模式:裝飾器模式(四)

    1、定義與動(dòng)機(jī) 裝飾器模式定義:動(dòng)態(tài)(組合)地給一個(gè)對(duì)象增加一些額外的職責(zé)。就增加功能而言,Decorator模式比生成子類(繼承)更為靈活(消除重復(fù)代碼 減少子類個(gè)數(shù))。 在某些情況下我們可能會(huì)“過(guò)度地使用繼承來(lái)擴(kuò)展對(duì)象的功能”,由于繼承為類型引入的靜態(tài)特質(zhì)

    2024年04月11日
    瀏覽(17)
  • 【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——裝飾者模式 C++實(shí)現(xiàn)

    設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來(lái)把你整個(gè)房間給污染掉。 動(dòng)態(tài)地將責(zé)任附加到對(duì)象上,若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。

    2024年02月10日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包