如果要开发一个跨平台的语言或库,应该怎么做?
就像现在的跨平台语言Java和跨平台库Qt,但是这两种库有本质区别。
Java:一次编译,到处运行。需借助JVM运行
Qt:一次编写,到处编译。编译后可直接运行。
这里以Qt为例,如何做到一次编写,到处编译呢?各种平台提供的API未必一致,为什么还可以跨平台编译呢,猜测原因是因为Qt编译器对外提供了统一的借口,而实现中分别调用相应平台的API。这里,Qt编译器就相当于Adapter(适配器)
假设窗体要经过注册---创建---显示这3个步骤,下面通过适配器提供统一接口模拟跨平台:
mywindows.h
//模拟windows下面创建窗口的函数
#include <iostream>
using namespace std;
//注册windows窗口类
void regWindows()
{
//里面为windows下面窗体类注册的具体执行过程
cout<<"执行windows注册窗体类的代码"<<endl;
}
//创建windows窗体
void createWindows()
{
//里面为windows下面创建窗体的具体执行过程
cout<<"执行windows创建窗体对象的代码"<<endl;
}
//显示windows窗体
void showWindows()
{
//里面为windows下面显示窗体的具体执行过程
cout<<"执行windows窗体显示的具体代码"<<endl;
}
mylinux.h
//模拟Linux下面创建窗口的函数
#include <iostream>
using namespace std;
//注册Linux窗口类
void regLinux()
{
//里面为Linux下面窗体类注册的具体执行过程
cout<<"执行Linux注册窗体类的代码"<<endl;
}
//创建Linux窗体
void createLinux()
{
//里面为Linux下面创建窗体的具体执行过程
cout<<"执行Linux创建窗体对象的代码"<<endl;
}
//显示Linux窗体
void showLinux()
{
//里面为Linux下面显示窗体的具体执行过程
cout<<"执行Linux窗体显示的具体代码"<<endl;
}
myAdapter.h
#ifdef MYWINDOWS
#include "mywindows.h"
#else
#include "mylinux.h"
#endif
class MyWidgetAdapter
{
public:
//适配器提供的注册
void reg()
{
#ifdef MYWINDOWS
regWindows();
#else
regLinux();
#endif
}
//适配器提供的创建
void create()
{
#ifdef MYWINDOWS
createWindows();
#else
createLinux();
#endif
}
//适配器提供的显示
void show()
{
#ifdef MYWINDOWS
showWindows();
#else
showLinux();
#endif
}
};
模拟windows下的创建:
#define MYWINDOWS
#include "myAdapter.h"
/*
**通过适配器模式,模拟跨平台
**真实中,可能不需要MYWINDOWS,MYLINUX之类的宏来判断,根据不同操作系统上,编译器提供不同的库。
**库对外提供统一的借口,内部调用不同平台的API
*/
int main()
{
MyWidgetAdapter w;
w.reg();
w.create();
w.show();
}
![](https://img-my.csdn.net/uploads/201210/21/1350796872_7902.png)
模拟linux下的创建
#define MYLINUX
#include "myAdapter.h"
/*
**通过适配器模式,模拟跨平台
**真实中,可能不需要MYWINDOWS,MYLINUX之类的宏来判断,根据不同操作系统上,编译器提供不同的库。
**库对外提供统一的借口,内部调用不同平台的API
*/
int main()
{
MyWidgetAdapter w;
w.reg();
w.create();
w.show();
}
![](https://img-my.csdn.net/uploads/201210/21/1350796945_7358.png)
特别注意的是:适配器模式是无奈之举,是没有办法中的办法,就像windows和linux估计永远不会提供统一的API接口.