Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 最近看了pixeltoastor的代码的总结--基于宏的"适配模式"(Adapter Pattern)
【标  题】:最近看了pixeltoastor的代码的总结--基于宏的"适配模式"(Adapter Pattern)
【关键字】:pixeltoastor,--,Adapter,Pattern
【来  源】:http://www.cppblog.com/CornerZhang/archive/2007/02/22/18916.html

最近看了pixeltoastor的代码的总结--基于宏的"适配模式"(Adapter Pattern)

Your Ad Here

平时口头上说的“Adapter Pattern”是指,库代码与实际应用端的功能需求不一致,但确实存在一部分的库代码可以重用,于是把库代码适配成所需的功能接口,于是“生出”一个适配器类,给某一个/或多个库中的作了一次功能包装,顺便补上没有的功能,所以,往往有如下这样的code:

// windowInterface是库的接口类,window_win32/window_qt/window_gtk是库中的实现类的情况下

class MyWindowAdaptor: public windowInterface, protected window_win32
{
public:
???//一些所需的接口函数...

? void resize(int x, int y) {???// eg.
??????// ...
??????window_win32::resize(x,y);
???}
};
或是
class MyWindowAdaptor: public windowInterface{
public:
???//一些所需的接口函数...

? void resize(int x, int y) {???// eg.
??????// ...
??????winImpl_.resize(x,y);
???}
private:
? window_win32 winImpl_;
};

而pixeltoastor里面使用了一丁点的宏,完成了类似的事情,并且由此得到了平台可移植性,把平台相关的实现代码约束在编译期,使得用户代码更为clear,大致的轮廓如下:

// window interface
struct WindowAdaptor {
? virtual ~WindowAdaptor() {}

? virtual void set(int ) =0;
? virtual int get() =0;
? virtual void update() =0;
? virtual void resize(int , int ) =0;
};

// device interface
struct GraphicAdaptor {
? virtual ~GraphicAdaptor() {}

? virtual bool beginScene() =0;
? virtual void endScene() =0;
? virtual void clearScene() =0;

? virtual void drawTriangle(Tri* pStart, unsigned count) =0;
};

?


// platform config macro
#ifdef WIN32
# define USE_OGL
# define USE_DX9
#elif LINUX
# define USE_OGL
#endif


// window implement
#ifdef WIN32
class Window_win32: public WindowAdaptor {
public:
? virtual ~Window_win32() {}

? virtual void set(int )
? { }

? virtual int get()
? { return 0; }

? virtual void update()
? { }

? virtual void resize(int , int )
? { }

? // ...
};
#define Window Window_win32
#endif

#ifdef LINUX
class Window_Linux: public WindowAdaptor {
? // implement code...
};
#define Window Window_Linux
#endif

// device implement
#ifdef USE_DX9
class GraphicDevice_Dx9: public GraphicAdaptor {
? // implement code...
};
#define GraphicDx9 GraphicDevice_Dx9
#endif

#ifdef USE_OGL
class GraphicDevice_OGL: public GraphicAdaptor {
? // implement code...
};
#define GraphicOGL GraphicDevice_OGL
#endif

?

/*? --------------------user code------------------------
// Display
class Display: public Window, public GraphicDx9 {
};

int main()
{
? Display disp;
? //...

? return 0;
}
*/

以上只是表示了逻辑结构,同时其物理结构也想象的出了!
这里保证了类型安全,不失灵活性与健壮性,却引入了可以接受的隐含的名称冲突,像这样的idom可以应用到与具体平台或设备相关的programming任务上,如:音频处理模块、输入设备模块。

{?Message("新春愉快!", "^o^"); }

深夜的暇想——有一套软件想出售:【上一篇】
ACE_WFMO_Reactor多路分配主干部分小结:【下一篇】
【相关文章】
  • struts标签使用举例--logic篇
  • boost库---系列解读一
  • 恶草丛生的阴暗角落---虚拟机制(上)
  • 恶草丛生的阴暗角落---虚拟机制(下)
  • How to Make Windows Start Up Faster---如何提高windows启动速度
  • 鸟哥的私房菜---学习手记四
  • 令人期待的OS -- AjaxOS
  • 半路遭劫--中间人攻击
  • 鸟哥的私房菜---学习手记三
  • 顶尖游戏公司介绍---暴雪
  • 【随机文章】
  • 开机密码
  • 安装Fedora FC5及播放mp3
  • 打造属于自己的字体
  • JSTL详解(一)
  • Openlaszlo配合struts开发RIA常见的几个问题整理
  • BIOS相关选项的含义和设置方法
  • 一站式系统
  • CISCO----FAQ区
  • ASP.NET和aspnet_regiis[zz]
  • E1,CE1,T1,PRI,BRI的区别以及接口
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.