C語言設計模式——硬(ying)件代理
							時(shi)間:2018-09-28      來源:未知 
							1. 抽象
硬件代(dai)理模式使(shi)用(yong)結構(gou)體封(feng)裝硬件設備,硬件有可能是內存、傳感(gan)器設備、IO設備等,但無(wu)論什么(me)樣的(de)設備,硬件代(dai)理的(de)作(zuo)用(yong)就(jiu)是隱藏硬件的(de)操作(zuo)細節,向客戶應用(yong)程序提供初始化、配(pei)置、讀寫數(shu)據、打開(kai)與關閉等操作(zuo)的(de)編程接(jie)口。
2. 解決的問題
如果(guo)每個用戶(hu)程(cheng)(cheng)(cheng)序都(dou)直接在程(cheng)(cheng)(cheng)序中訪問操(cao)作底層硬(ying)(ying)件,當(dang)更(geng)換(huan)了相同功能的不同硬(ying)(ying)件設備時,有可能硬(ying)(ying)件接口并不一(yi)致,而且對(dui)硬(ying)(ying)件的操(cao)作與控制方式(shi)也(ye)并不一(yi)樣,這(zhe)種情況下,就(jiu)要修改每一(yi)個用戶(hu)程(cheng)(cheng)(cheng)序,導致程(cheng)(cheng)(cheng)序不容(rong)易維護。
通過提供位于實際硬件(jian)與用戶程序(xu)之間(jian)的代理(li),就可以(yi)極大程度避免(mian)因為更換硬件(jian)而影響程序(xu)的設計,有效(xiao)減少對程序(xu)的修(xiu)改(gai)。
為了方便維護,客戶程序可以不用關心設備的具體(ti)通信(xin)細(xi)節,這(zhe)些細(xi)節都要在(zai)硬件代理(li)的內(nei)部私有方法中實現。
3. 模式結構
硬件(jian)代(dai)理模(mo)式的基(ji)本組成結構圖(tu)表示如下:
  
圖 硬件(jian)代理模式
4. 協作角色
4.1. 硬件設備
硬件設備描述了(le)實際的硬件,所以不會為(wei)(wei)這個元素編寫(xie)C語言代碼,放(fang)在圖里只是為(wei)(wei)了(le)方便理解。
硬件設備(bei)和代理(li)之間的關系(xi)就是通(tong)過通(tong)信端口、內存地址映射或者中斷等方式互相關聯起來。
4.2. 硬件代理
這(zhe)個(ge)是(shi)設(she)計(ji)模(mo)式中主要的部分,也是(shi)一個(ge)主要的類。
其中包(bao)含了描述(shu)設備(bei)(bei)所使(shi)(shi)用的(de)數據,以及操作設備(bei)(bei)的(de)時候可以使(shi)(shi)用的(de)函數。
以上圖為例,這個硬件代(dai)理包含了(le)一個void類(lei)型(xing)的變量hardware,用(yong)(yong)(yong)來描述設備(bei)的屬性,這里為了(le)方便表達(da),使用(yong)(yong)(yong)了(le)void類(lei)型(xing),實際應(ying)用(yong)(yong)(yong)的時候(hou),會使用(yong)(yong)(yong)相應(ying)的類(lei)型(xing),包括基本類(lei)型(xing)和組合類(lei)型(xing)(結構體(ti)、聯合體(ti)),但是多(duo)數(shu)情況下硬件代(dai)理使用(yong)(yong)(yong)結構體(ti)會比(bi)較(jiao)多(duo)一點。這些數(shu)據(ju)屬性也可以叫(jiao)做“類(lei)屬性”。
除了(le)數據屬性(xing),硬件(jian)代理里面還定義了(le)如下函數:
init() ——多(duo)用于(yu)對硬件設備的初始化(hua)操作
open() ——用于對設備的打開操(cao)作
close() ——用(yong)于關(guan)閉設備(bei)
read() ——用(yong)于從設(she)備中讀取數據
write() ——用于往設備寫(xie)數據
這里定義的(de)(de)函數(shu)僅(jin)僅(jin)是為了方便理(li)解,實際(ji)應用(yong)的(de)(de)時候,根據不同(tong)的(de)(de)硬件所支(zhi)持的(de)(de)不同(tong)操作,定義不同(tong)的(de)(de)函數(shu),這些函數(shu)也可(ke)以(yi)叫做(zuo)“類方法”。
在C語言中,類的(de)定(ding)義與使(shi)用(yong)需要(yao)一定(ding)的(de)構造技巧,類的(de)聲明使(shi)用(yong).h頭文(wen)件(jian)封裝,類方法(fa)的(de)定(ding)義使(shi)用(yong).c源文(wen)件(jian)進(jin)行封裝。
上圖所(suo)表示的HWProxy代理就可以用如下兩個文(wen)件來描述:
HWProxy.h文(wen)件(jian):
/****************************************************
* HWProxy.h
* Created on: 03-五(wu)月-2017 下午 5:19:38  
* Implementation of the Class HWProxy
* Original author: LvXin
 ****************************************************/
#ifndef _HWProxy_H
#define _HWProxy_H
#ifdef __cplusplus
extern "C" {
#endif
typedef struct HWProxy HWProxy_t;
struct HWProxy {
void hardware;
};
int close (HWProxy_t *me);
int init (HWProxy_t *me);
int open (HWProxy_t *me);
int read (HWProxy_t *me);
int write (HWProxy_t *me, int data);
#ifdef __cplusplus
}
#endif
#endif /*!defined(_HWProxy_H)*/
HWProxy.c文件:
/****************************************************
* HWProxy.c  
* Created on: 03-五月(yue)-2017 下午 5:19:38  
* Implementation of the Class HWProxy
* Original author: LvXin
****************************************************/
#include "HWProxy.h"
int close(HWProxy_t *me)
{
return 0;
}
int init(HWProxy_t *me)
{
return 0;
}
int open(HWProxy_t *me)
{
return 0;
}
int read(HWProxy_t *me)
{
return 0;
}
int write(HWProxy_t *me, int data)
{
return 0;
}
這(zhe)是一個簡單的(de)硬件代理的(de)框架(jia),這(zhe)里要(yao)強調(diao)的(de)是所有(you)的(de)對外開放(fang)的(de)聲明,指示類的(de)東西全(quan)都要(yao)放(fang)在(zai).h文件中,而(er)所有(you)定(ding)義類的(de)東西,比(bi)如靜態(tai)變量、函(han)數(shu)定(ding)義等,全(quan)都要(yao)放(fang)在(zai).c文件中。私有(you)的(de)數(shu)據或者方法要(yao)用static做限定(ding),并(bing)且不要(yao)放(fang)在(zai).h文件里。
5. 效果
硬件代理模式非常簡單,具有封裝硬件接(jie)口,以(yi)及屏蔽硬件編碼細節的優(you)點。
可(ke)以(yi)實(shi)現(xian)(xian)不改變用戶代(dai)(dai)碼,只(zhi)修改硬件(jian)代(dai)(dai)理(li)的(de)(de)細節,就(jiu)可(ke)以(yi)從(cong)根本上改變具(ju)(ju)體(ti)硬件(jian),提供(gong)(gong)了非常好(hao)的(de)(de)靈(ling)活性。因為(wei)硬件(jian)的(de)(de)操(cao)作(zuo)細節都被封裝到了硬件(jian)代(dai)(dai)理(li)的(de)(de)具(ju)(ju)體(ti)方法里,用戶代(dai)(dai)碼只(zhi)需要直接(jie)調用硬件(jian)代(dai)(dai)理(li)提供(gong)(gong)的(de)(de)函數接(jie)口,就(jiu)可(ke)以(yi)實(shi)現(xian)(xian)對設備的(de)(de)操(cao)作(zuo)。

