設計模式C++實現:包裝器外觀模式(Wrapper Facade)
阿新 • • 發佈:2019-02-06
包裝器外觀模式(Wrapper Facade)把現有的非面向物件的API所提供的函式和資料,封裝在更加簡潔的、健壯的、可移植的、可維護的和內聚的面向物件的類介面中。
一般通過兩種方式實現跨平臺:
1.用類似#ifdef巨集的條件編譯。
2.目錄分離。如每個作業系統平臺有自己的目錄,包含與平臺有關的包裝器外觀的實現。可使用語言處理工具在編譯時從相關的目錄中包含合適的包裝器外觀的實現類。
類圖如下:
時序圖:
例子:
#if defined(_WIN32)
#include <windows.h>
#else
#include <pthread.h>
#include <sys/errno.h>
#endif
class jmutex
{
public:
jmutex();
~jmutex();
void lock();
void unlock();
bool tryLock();
private:
void init(void);
#ifdef _WIN32
access
CRITICAL_SECTION criticalSection_;
#else
pthread_mutex_t hMutex_;
#endif
};
jmutex::jmutex()
{
init();
}
jmutex::~jmutex()
{
#ifdef _WIN32
DeleteCriticalSection(&criticalSection_);
#else
pthread_mutex_destroy(&hMutex_);
#endif
}
void jmutex::lock(void)
{
#ifdef _WIN32
EnterCriticalSection(&criticalSection_);
#else
pthread_mutex_lock(&hMutex_);
#endif
}
void jmutex::unlock(void)
{
#ifdef _WIN32
LeaveCriticalSection(&criticalSection_);
#else
pthread_mutex_unlock(&hMutex_);
#endif
}
bool jmutex::tryLock()
{
#ifndef WIN32
int error = pthread_mutex_trylock(&hMutex_); //EAGAIN
assert(error==0||error==EBUSY);
return (error==0);
#else
this->lock();
return true;
#endif
}
void jmutex::init(void)
{
#ifdef _WIN32
InitializeCriticalSection(&criticalSection_);
#else
int error = pthread_mutex_init(&hMutex_, 0);
assert(error==0);
#endif
}
包裝器外觀模式的優點:
1.具體的、內聚的和健壯的更高階面向物件的程式設計介面。
2.可移植性和可維護性好。
3.模組性、可複用性和可配置性強。
缺點:
1.功能喪失。當抽象阻止開發人員訪問底層抽象的特定能力時,如開發人員在基於socket包裝器類上想實現設定快取區大小。
2.效能降低。多一層或幾層函式呼叫。
3.程式語言和編譯器的侷限性。如整合C函式到類似smalltalk或java這樣的語言時,就不存在可廣為接受的標準。
參考《面向模式的軟體體系結構:卷2》