提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
提示:以下是本篇文章正文内容,下面案例可供参考
一、Bad Code
- 问题 1
高等级的EmployeeDAO依赖于SqlConnection等低等级类,如果换一种数据库,又要重新写一遍整个处理流程;
- 问题2
SqlConnection等数据库类和其具体的implement方法耦合在一起,换一种其他的数据库,这些方法也要重新写一遍
class EmployeeDAO
{
public:
std::vector<Employee> GetEmployees();
{
// 1. 建立数据库连接
SqlConnection* connection = new SqlConnection();
connection->ConnectionString = "...";
// 2. 建立命令对象
SqlCommand* command = new SqlCommand();
command->CommandText = "....";
// 3. 建立datareader对象
SqlDataReader* reader =command->ExecuteReader();
while (read->Read())
{
/* code */
}
}
}
二、improved code
利用工厂方法, 将Connection、 Command、 DataReader抽象成基类作为接口类,并且创建每一个对应的工厂类作为工厂的接口类。每一种数据库,都会有具体的implement类和具体的工厂类。将client里面的pipeline改成如下所示
// 数据库访问有关的基类
class IDBConnection
{
};
// 对应的工厂
class IDBConnectionFactory
{
public:
IDBConnectionFactory();
virtual ~IDBConnectionFactory();
virtual IDBConnection* createConnection() = 0;
};
class IDBCommand
{
}