吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式軟件設計模式 好文值得收藏

lucky的記錄與分享 ? 來源:lucky的記錄與分享 ? 作者:lucky的記錄與分享 ? 2022-06-20 09:09 ? 次閱讀

本文引用自本人公眾號文章:

嵌入式開發中的兩點編程思想

C語言也很講究設計模式?一文講透

包含如下:

01)C語言和設計模式(繼承、封裝、多態)

02)C語言和設計模式(訪問者模式)

03)C語言和設計模式(狀態模式)

04)C語言和設計模式(命令模式)

05)C語言和設計模式(解釋器模式)

06)C語言和設計模式(備忘錄模式)

07)C語言和設計模式(觀察者模式)

08)C語言和設計模式(橋接模式)

09)C語言和設計模式(建造者模式)

10)C語言和設計模式(中介者模式)

11)C語言和設計模式(策略模式)

12)C語言和設計模式(適配器模式)

13)C語言和設計模式(裝飾模式)

14)C語言和設計模式(享元模式)

15)C語言和設計模式(代理模式)

16)C語言和設計模式(外觀模式)

17)C語言和設計模式(迭代器模式)

18)C語言和設計模式(抽象工廠模式)

19)C語言和設計模式(責任鏈模式)

20)C語言和設計模式(工廠模式)

21)C語言和設計模式(模板模式)

22)C語言和設計模式(組合模式)

23)C語言和設計模式(原型模式)

24)C語言和設計模式(單件模式)

25)C語言和設計模式(開篇)

-----------------------
01)C語言和設計模式(繼承、封裝、多態)

記得還在我們大學C++第一門課的時候,老師就告訴我們說,C++是一門面向對象的語言。C++有三個最重要的特點,即繼承、封裝、多態。等到后來隨著編碼的增多和工作經驗的積累,我也慢慢明白了面向對象的含義。可是,等我工作以后,使用的編程語言更多的是C語言,這時候我又想能不能把C語言變成面向對象的語言呢?等到后來通過思考和實踐,我發現其實C語言也是可以面向對象的,也是可以應用設計模式的,關鍵就在于如何實現面向對象語言的三個重要屬性。
(1)繼承性
typedef struct _parent
{
int data_parent;
}Parent;
typedef struct _Child
{
struct _parent parent;
int data_child;
}Child;
在設計C語言繼承性的時候,我們需要做的就是把基礎數據放在繼承的結構的首位置即可。這樣,不管是數據的訪問、數據的強轉、數據的訪問都不會有什么問題。
(2)封裝性
struct _Data;
typedef void (*process)(struct _Data* pData);
typedef struct _Data
{
int value;
process pProcess;
}Data;
封裝性的意義在于,函數和數據是綁在一起的,數據和數據是綁在一起的。這樣,我們就可以通過簡單的一個結構指針訪問到所有的數據,遍歷所有的函數。封裝性,這是類擁有的屬性,當然也是數據結構體擁有的屬性。
(3)多態
typedef struct _Play
{
void* pData;
void (*start_play)(struct _Play* pPlay);
}Play;
多態,就是說用同一的接口代碼處理不同的數據。比如說,這里的Play結構就是一個通用的數據結構,我們也不清楚pData是什么數據,start_play是什么處理函數?但是,我們處理的時候只要調用pPlay->start_play(pPlay)就可以了。剩下來的事情我們不需要管,因為不同的接口會有不同的函數去處理,我們只要學會調用就可以了。

-----------------------

02)C語言和設計模式(訪問者模式)


不知不覺當中,我們就到了最后一種設計模式,即訪問者模式。訪問者模式,聽上去復雜一些。但是,這種模式用簡單的一句話說,就是不同的人對不同的事物有不同的感覺。比如說吧,豆腐可以做成麻辣豆腐,也可以做成臭豆腐。可是,不同的地方的人未必都喜歡這兩種豆腐。四川的朋友可能更喜歡辣豆腐,江浙的人就可能對臭豆腐更喜歡一些。那么,這種情況應該怎么用設計模式表達呢?
typedef struct _Tofu
{
int type;
void (*eat) (struct _Visitor* pVisitor, struct _Tofu* pTofu);
}Tofu;
typedef struct _Visitor
{
int region;
void (*process)(struct _Tofu* pTofu, struct _Visitor* pVisitor);
}Visitor;
就是這樣一個豆腐,eat的時候就要做不同的判斷了。
void eat(struct _Visitor* pVisitor, struct _Tofu* pTofu)
{
assert(NULL != pVisitor && NULL != pTofu);
pVisitor->process(pTofu, pVisitor);
}
既然eat的操作最后還是靠不同的visitor來處理了,那么下面就該定義process函數了。
void process(struct _Tofu* pTofu, struct _Visitor* pVisitor)
{
assert(NULL != pTofu && NULL != pVisitor);
if(pTofu->type == SPICY_FOOD && pVisitor->region == WEST ||
pTofu->type == STRONG_SMELL_FOOD && pVisitor->region == EAST)
{
printf("I like this food!\n");
return;
}
printf("I hate this food!\n");
}

-----------------------------------------------------

03)C語言和設計模式(狀態模式)

狀態模式是協議交互中使用得比較多的模式。比如說,在不同的協議中,都會存在啟動、保持、中止等基本狀態。那么怎么靈活地轉變這些狀態就是我們需要考慮的事情。假設現在有一個state,
typedef struct _State
{
void (*process)();
struct _State* (*change_state)();
}State;
說明一下,這里定義了兩個變量,分別process函數和change_state函數。其中proces函數就是普通的數據操作,
void normal_process()
{
printf("normal process!\n");
}
change_state函數本質上就是確定下一個狀態是什么。
struct _State* change_state()
{
State* pNextState = NULL;
pNextState = (struct _State*)malloc(sizeof(struct _State));
assert(NULL != pNextState);
pNextState ->process = next_process;
pNextState ->change_state = next_change_state;
return pNextState;
}
所以,在context中,應該有一個state變量,還應該有一個state變換函數。
typedef struct _Context
{
State* pState;
void (*change)(struct _Context* pContext);
}Context;
void context_change(struct _Context* pContext)
{
State* pPre;
assert(NULL != pContext);
pPre = pContext->pState;
pContext->pState = pPre->changeState();
free(pPre);
return;
}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5092

    文章

    19177

    瀏覽量

    307665
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137712
  • 嵌入式軟件
    +關注

    關注

    4

    文章

    240

    瀏覽量

    26729
收藏 人收藏

    評論

    相關推薦

    嵌入式機器學習的應用特性與軟件開發環境

    設備和智能傳感器)上,這些設備通常具有有限的計算能力、存儲空間和功耗。本文將您介紹嵌入式機器學習的應用特性,以及常見的機器學習開發軟件與開發環境。 嵌入式機器學習的應用特性與優勢 由于嵌入式
    的頭像 發表于 01-25 17:05 ?173次閱讀
    <b class='flag-5'>嵌入式</b>機器學習的應用特性與<b class='flag-5'>軟件</b>開發環境

    哪些專業適合學習嵌入式開發?

    網絡協議與標準,包括MQTT、CoAP以及HTTP等,適合物聯網領域的數據交換和通信。 5)物聯網工程:直接關聯物聯網領域,涉及嵌入式系統、網絡通信、數據處理與分析等,適合物聯網領域。 6)機械專業:機械專業的學生可以通過學習嵌入式軟件
    發表于 01-03 13:44

    嵌入式系統開發與硬件的關系 嵌入式系統開發常見問題解決

    嵌入式系統開發與硬件的關系 嵌入式系統是專為特定應用設計的計算機系統,它們通常嵌入在所控制的設備中。這些系統的關鍵特點是它們與硬件的緊密集成,這意味著軟件必須為特定的硬件平臺量身定制。
    的頭像 發表于 12-09 09:38 ?416次閱讀

    嵌入式條碼掃描器的幾種掃描模式

    嵌入式條碼掃描器的掃描模式是指其在識別條碼時的工作模式,這些模式會影響到掃描器的使用效果和適用場景。以下是幾種常見的嵌入式條碼掃描器的掃描
    的頭像 發表于 11-19 16:27 ?244次閱讀
    <b class='flag-5'>嵌入式</b>條碼掃描器的幾種掃描<b class='flag-5'>模式</b>

    一文了解嵌入式軟件開發的對象

    以前應用場景很單一,嵌入式開發可能談不上面向對象開發。但現在,做嵌入式開發,沒有面向對象開發,你就有點落伍了。 本文結合個人經驗和周立功《抽象接口技術和組件開發規范及其思想》,循序漸進的用代碼范例說明嵌入式
    的頭像 發表于 11-15 10:31 ?430次閱讀
    一文了解<b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>開發的對象

    嵌入式學習建議

    對廣大渴望學習嵌入式系統的學子提出幾點基礎階段的學習建議: ①嵌入式系統軟件硬件密切相關,一定要打好軟硬件基礎。其實,只要找到正確的方法,加上努力,任何理工科學生,甚至非理工科學生,都能學好
    發表于 10-22 11:41

    什么是嵌入式?一文讀懂嵌入式主板

    在現代科技浪潮中,嵌入式技術已成為支撐各種智能設備和系統運行的核心力量。那么,究竟什么是嵌入式嵌入式系統,顧名思義,是將計算機的硬件和軟件嵌入
    的頭像 發表于 10-16 10:14 ?1576次閱讀

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被稱為嵌入式系統的核心組件,是一種用于控制和數據處理的計算機硬件,其設計旨在嵌入特定設備中執行專門任務。嵌入式主板如同是設備的“大腦”,主要功能是根據需要管理和控制設備
    的頭像 發表于 09-30 10:05 ?970次閱讀

    EsDA,一站嵌入式軟件

    ,旨在提高嵌入式軟件開發的效率、性能和可擴展性。EsDA全稱是嵌入式系統設計自動化,它是一個由AWorksLP、AWStudio、AXPI、AWTK、ZWS等多種軟件
    的頭像 發表于 09-15 08:10 ?358次閱讀
    EsDA,一站<b class='flag-5'>式</b><b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>

    嵌入式系統中的實時操作系統

    嵌入式RTOS是嵌入式應用程序運行、相互交互和與外界通信的底層軟件機制。在本節中,您將了解嵌入式軟件開發人員使用哪些流行RTOS以及它們運行
    的頭像 發表于 08-20 11:28 ?546次閱讀

    嵌入式軟件開發與AI整合

    嵌入式軟件開發與AI整合是當前技術發展的重要趨勢之一。隨著人工智能技術的快速發展,嵌入式系統越來越多地集成了AI算法,以實現更復雜的智能功能。以下是關于嵌入式
    的頭像 發表于 07-31 09:25 ?831次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>開發與AI整合

    嵌入式系統怎么學?

    系統設計與調試:需要掌握嵌入式系統的設計方法和調試技術,包括硬件設計、軟件設計、電路調試等,以確保系統的穩定性和可靠性。 隨著技術的不斷進步和應用場景的不斷拓展,嵌入式系統將繼續發揮重要作用,推動著
    發表于 07-02 10:10

    嵌入式軟件工程師如何提升自己?

    嵌入式軟件工程師如何提升自己? 作為一名嵌入式軟件工程師,在這個充滿機遇和挑戰的領域里,如何提升自己顯得非常重要,它決定了你未來的發展方向和成就。接下來,我們一起探討一下。 1.奠定扎
    發表于 06-12 11:20

    嵌入式軟件設計的原則分享

    嵌入式軟件開發如果具有更好的閱讀性、擴展性以及維護性,就需要考慮很多因素。今天給大家分享幾個嵌入式軟件設計的原則。
    發表于 02-25 10:54 ?750次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件設計</b>的原則分享

    嵌入式軟件開發應該掌握哪些知識?

    嵌入式軟件開發應該掌握哪些知識? 一、 什么是嵌入式軟件嵌入式軟件通常是指
    發表于 02-19 11:23
    玩百家乐怎么能赢吗| 大发888是什么游戏| 百家乐2珠路投注法| 百家乐官网稳赢投注方法| 大发扑克官方网站| 大发888 游戏下载| CEO百家乐娱乐城| 百家乐百胜注码法| 百家乐平台导航| 百家乐网址多少| 赌博百家乐官网的玩法技巧和规则| 网上百家乐官网注册彩金| 德昌县| 国际豪门娱乐| 金宝博娱乐城返水| 大连百家乐食品| 澳门档百家乐的玩法技巧和规则| 金沙城百家乐大赛规则| 百家乐视频游戏视频| 百家乐15人桌子| 网上百家乐辅助软件| 网上百家乐破战| 97玩棋牌游戏中心| 7298棋牌官网| 百家乐官网纯数字玩法| 国际百家乐官网规则| 苏尼特右旗| 百家乐官网试玩全讯网2| 百家乐官网哪家有优惠| 澳门百家乐官网技巧皇冠网| 百家乐官网网上真钱麻将| 百家乐官网的寻龙定穴| 百家乐官网代理条件| 百家乐官网透视牌靴| 百家乐官网娱乐分析软件v| 百家乐策略与心得| 百家乐群sun811.com| 兄弟百家乐的玩法技巧和规则| 大发888娱乐城欢迎lm0| 皇冠真钱| 百家乐官网投注方法投资法|