1. 适配器模式
适配器模式(Adapter
Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式(class adapter),也可以作为对象结构型模式(object adapter)。
举例:
2. 适配器代码
2.1 class adapter
#include <iostream>
using namespace std;
enum sqlType
{
mysqlType = 1,
sqlite3Type,
postgersqlType
};
enum sqlType type;
class mysql
{
public:
void select ()
{
cout << "mysql select" << endl;
}
};
class sqlite3
{
public:
void select ()
{
cout << "sqlite3 select" << endl;
}
};
class postgersql
{
public:
void select ()
{
cout << "postgersql select" << endl;
}
};
class ORM:public mysql, public sqlite3, public postgersql
{
public:
void orm_select ()
{
switch (type)
{
case mysqlType:
mysql::select ();
break;
case sqlite3Type:
sqlite3::select ();
break;
case postgersqlType:
postgersql::select ();
break;
default:
break;
}
}
};
void init_sqltype (enum sqlType t)
{
type = t;
}
int main ()
{
ORM * o = new ORM ();
init_sqltype (mysqlType);
o->orm_select ();
init_sqltype (sqlite3Type);
o->orm_select ();
init_sqltype (postgersqlType);
o->orm_select ();
delete o;
return 0;
}
2.2 object adapter
#include <iostream>
using namespace std;
enum sqlType
{
mysqlType = 1,
sqlite3Type,
postgersqlType
};
enum sqlType type;
class mysql
{
public:
void select ()
{
cout << "mysql select" << endl;
}
};
class sqlite3
{
public:
void select ()
{
cout << "sqlite3 select" << endl;
}
};
class postgersql
{
public:
void select ()
{
cout << "postgersql select" << endl;
}
};
class ORM:public mysql, public sqlite3, public postgersql
{
public:
void orm_select ()
{
switch (type)
{
case mysqlType:
m_mysql->select ();
break;
case sqlite3Type:
m_sqlite3->select ();
break;
case postgersqlType:
m_postgersql->select ();
break;
default:
break;
}
}
void setmysql(mysql * a){m_mysql = a;}
void setsqlite3(sqlite3 * a){m_sqlite3 = a;}
void setpostgersql(postgersql * a){m_postgersql = a;}
private:
mysql *m_mysql;
sqlite3 *m_sqlite3;
postgersql *m_postgersql;
};
void init_sqltype (enum sqlType t)
{
type = t;
}
int main ()
{
mysql *m_mysql = new mysql;
sqlite3 *m_sqlite3 = new sqlite3;
postgersql *m_postgersql = new postgersql;
ORM * o = new ORM ();
o->setmysql(m_mysql);
o->setsqlite3(m_sqlite3);
o->setpostgersql(m_postgersql);
init_sqltype (mysqlType);
o->orm_select ();
init_sqltype (sqlite3Type);
o->orm_select ();
init_sqltype (postgersqlType);
o->orm_select ();
delete o;
delete m_mysql;
delete m_sqlite3;
delete m_postgersql;
return 0;
}