C++设计模式平台特定API

5
我正在使用Windows系统。我需要查看一些适用于Windows 2008及以上版本的API,以及适用于其他版本Windows的不同API。我想知道设计这种东西的最佳方式是什么,这样我的主驱动代码就不需要使用 #ifdef。

例如,在Windows 2008中我们有以下API:

EVT_HANDLE WINAPI EvtOpenLog(
  __in  EVT_HANDLE Session,
  __in  LPCWSTR Path,
  __in  DWORD Flags
);

对于Windows 2003,我们有另一个API可以实现相同的功能。

HANDLE OpenEventLog(
  __in  LPCTSTR lpUNCServerName,
  __in  LPCTSTR lpSourceName
);

我希望您的代码中有一种封装API,可以在内部处理这些调用。

你是说你希望主驱动程序代码在不考虑基础依赖API的情况下使用相同的高级API吗? - Emile Cormier
也许是设计模式书中的GUIFactory。你能举一些例子说明它们之间有什么不同吗?使用哪些API? - Ray Tayek
2个回答

6
你可以编写一个平台抽象层,它将为所有api类型和每个端口公开一个通用接口,然后您可以实现该接口。您可以将抽象作为每个端口的单独库提供,从而确保您调用的应用程序保持不变,只有要链接的库发生更改。

基本上这是正确的方法。有两种实现方式,一种是为每个平台使用一个遵循通用接口的单独类,另一种是使用包含代码中所有ifdefs的Facade。在第二种情况下,您不需要一个类,可以直接拥有函数。 - rioki

0

一种方法是在头文件中拥有一个不变的接口,并为每个所需平台拥有单独的.cpp文件。然后,您只编译给定平台所需的.cpp。

第二种方法是拥有一个单一的基类接口,它不会改变,并且通过虚函数修改代码的子类,但我不建议使用这种方法。

另一种方法是使用类似于PIMPL(指向实现的指针)惯用语的东西。这种方法将允许您的头文件接口永远不会改变,并且还将在私有类实现中隐藏所有特定于平台的数据。这是一篇关于这种设计模式的半好文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接