嵌入式中設(shè)計(jì)模式的藝術(shù)
設(shè)計(jì)模式設(shè)計(jì)模式的標(biāo)簽:高級(jí)語(yǔ)言 ,高端,架構(gòu)等。在AIOT時(shí)代,設(shè)計(jì)模式與嵌入式能擦出怎樣的火花?設(shè)計(jì)模式可描述為:對(duì)于某類相似的問(wèn)題,經(jīng)過(guò)前人的不斷嘗試,總結(jié)出了處理此類問(wèn)題的公認(rèn)的有效解決辦法。嵌入式主要以C語(yǔ)言開(kāi)發(fā),且面向過(guò)程,而設(shè)計(jì)模式常見(jiàn)于高級(jí)語(yǔ)言(面向?qū)ο螅?,目前市面上描述設(shè)計(jì)模式的書籍多數(shù)使用JAVA 語(yǔ)言,C語(yǔ)言能實(shí)現(xiàn)設(shè)計(jì)模式嗎?設(shè)計(jì)模式與語(yǔ)言無(wú)關(guān),它是解決問(wèn)題的方法,JAVA可以實(shí)現(xiàn),C語(yǔ)言同樣可以實(shí)現(xiàn)。同樣的,JAVA程序員會(huì)遇到需要用模式來(lái)處理的問(wèn)題,C程序員也可能遇見(jiàn),因此設(shè)計(jì)模式是很有必要學(xué)習(xí)的。模式陷阱:設(shè)計(jì)模式是針對(duì)具體的某些類問(wèn)題的有效解決辦法,不是所有的問(wèn)題都能匹配到對(duì)應(yīng)的設(shè)計(jì)模式。因此,不能一味的追求設(shè)計(jì)模式,有時(shí)候簡(jiǎn)單直接的處理反而更有效。有的問(wèn)題沒(méi)有合適的模式,可以盡量滿足一些設(shè)計(jì)原則,如開(kāi)閉原則(對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉)
觀察者模式
情景在對(duì)象之間定義一個(gè)一對(duì)多的依賴,當(dāng)一個(gè)對(duì)象狀態(tài)改變的時(shí)候,所有依賴的對(duì)象都會(huì)自動(dòng)收到通知。實(shí)現(xiàn)主題對(duì)象提供統(tǒng)一的注冊(cè)接口,以及注冊(cè)函數(shù) 。由觀察者本身實(shí)例化observer_intf 接口,然后使用注冊(cè)函數(shù),添加到對(duì)應(yīng)的主題列表中,主題狀態(tài)發(fā)生改變,依次通知列表中的所有對(duì)象。- ?struct observer_ops
- ?{
- ? void*(handle)(uint8_t evt); ?
- ?};
- ?
- ?struct observer_intf
- ?{
- ? ? ?struct observer_intf* next;
- ? ? ?const char* name;
- ? ? ?void* condition;
- ? ? ?const struct observer_ops *ops;
- ?}
- ?
- ?int observer_register(struct topical* top , struct observer_intf* observer);
當(dāng)主題狀態(tài)發(fā)生改變,將通知到所有觀察者,觀察者本身也可以設(shè)置條件,是否選擇接收通知- ?struct observer_intf observer_list;
- ? ? ?
- ?void XXXX_topical_evt(uint8_t evt)
- ?{
- ? ? ? struct observer_intf* cur_observer = observer_list.next;
- ? ? ? uint8_t* condition = NULL;
- ? ? ? while(cur_observer != NULL)
- ? ? ? {
- ? ? ? ? ? condition = (uint8_t*)cur_observer->condition;
- ? ? ? ? ? if(NULL == condition || (condition