1. 抽象
硬件代理模式使用結構體封裝硬件設備,硬件有可能是內存、傳感器設備、IO設備等,但無論什么樣的設備,硬件代理的作用就是隱藏硬件的操作細節,向客戶應用程序提供初始化、配置、讀寫數據、打開與關閉等操作的編程接口。
2. 解決的問題
如果每個用戶程序都直接在程序中訪問操作底層硬件,當更換了相同功能的不同硬件設備時,有可能硬件接口并不一致,而且對硬件的操作與控制方式也并不一樣,這種情況下,就要修改每一個用戶程序,導致程序不容易維護。
通過提供位于實際硬件與用戶程序之間的代理,就可以極大程度避免因為更換硬件而影響程序的設計,有效減少對程序的修改。
為了方便維護,客戶程序可以不用關心設備的具體通信細節,這些細節都要在硬件代理的內部私有方法中實現。
3. 模式結構
硬件代理模式的基本組成結構圖表示如下:
圖 硬件代理模式
4. 協作角色
4.1. 硬件設備
硬件設備描述了實際的硬件,所以不會為這個元素編寫C語言代碼,放在圖里只是為了方便理解。
硬件設備和代理之間的關系就是通過通信端口、內存地址映射或者中斷等方式互相關聯起來。
4.2. 硬件代理
這個是設計模式中主要的部分,也是一個主要的類。
其中包含了描述設備所使用的數據,以及操作設備的時候可以使用的函數。
以上圖為例,這個硬件代理包含了一個void類型的變量hardware,用來描述設備的屬性,這里為了方便表達,使用了void類型,實際應用的時候,會使用相應的類型,包括基本類型和組合類型(結構體、聯合體),但是多數情況下硬件代理使用結構體會比較多一點。這些數據屬性也可以叫做“類屬性”。
除了數據屬性,硬件代理里面還定義了如下函數:
init() ——多用于對硬件設備的初始化操作
open() ——用于對設備的打開操作
close() ——用于關閉設備
read() ——用于從設備中讀取數據
write() ——用于往設備寫數據
這里定義的函數僅僅是為了方便理解,實際應用的時候,根據不同的硬件所支持的不同操作,定義不同的函數,這些函數也可以叫做“類方法”。
在C語言中,類的定義與使用需要一定的構造技巧,類的聲明使用.h頭文件封裝,類方法的定義使用.c源文件進行封裝。
上圖所表示的HWProxy代理就可以用如下兩個文件來描述:
HWProxy.h文件:
/****************************************************
* HWProxy.h
* Created on: 03-五月-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-五月-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;
}
這是一個簡單的硬件代理的框架,這里要強調的是所有的對外開放的聲明,指示類的東西全都要放在.h文件中,而所有定義類的東西,比如靜態變量、函數定義等,全都要放在.c文件中。私有的數據或者方法要用static做限定,并且不要放在.h文件里。
5. 效果
硬件代理模式非常簡單,具有封裝硬件接口,以及屏蔽硬件編碼細節的優點。
可以實現不改變用戶代碼,只修改硬件代理的細節,就可以從根本上改變具體硬件,提供了非常好的靈活性。因為硬件的操作細節都被封裝到了硬件代理的具體方法里,用戶代碼只需要直接調用硬件代理提供的函數接口,就可以實現對設備的操作。