我正在构建一个 Web 应用程序,该应用程序需要能够将数据写入 mysql db 或 xml 文件,具体取决于应用程序的在线状态。
在我的模型中,我有一个超类(Dao 是数据访问对象)......
abstract class Dao {
static function getInstance($online_status) {
if $online_status = 'online' {
return new DaoMySQL;
} else {
return new DaoXML;
}
}
abstract function dao_select();
abstract function dao_insert();
abstract function dao_update();
abstract function dao_delete();
}
现在,这是我感到困惑的部分。我有一个域模型/实体类,它使用以下方法选择适当的 Dao:
$this->dao = Dao::getInstance($online_status);
所以,现在我选择了正确的数据访问对象。但是,问题是我仍然是 dao_select() 和其他函数的两个实现。现在,主要实现在各自的类 DaoMySQL 和 DaoXML 中,但是每个类中的 dao_select() 需要不同的东西。即 DaoMySQL 版本需要两个参数,$table 和 $where_statement。DaoXML(我还没有实现)将需要元素名称,也许还有另一个参数,我不知道。
所以,在我的域模型类中,调用后
$this->dao = Dao::getInstance($online_status);
这是我需要包含 dao_select() 的两个单独的本地实现(仅与域模型/实体类有关)的地方,还是这个错误?似乎我通过执行以下操作将优雅带出过程:
class EntityModel {
$this->dao = Dao::getInstance($online_status);
if($this->dao->type = 'mysql') {
$result = $this->dao->dao_select($table, $where);
} else {
$result = $this->dao->dao_select($xml_params);
}
}
我觉得我正在从系统中删除简单性......这种方法是否有意义,还是有更好的方法?