我有两个类,一个类完成了从数据库(已实现)获取数据的所有工作,另一个完成了从文件(现在正在实现)获取数据的所有工作。
这里的问题是我希望能够切换流式传输(数据库或文件)。仅需要一次检查数据库还是文件的过程。
因此,对于类中的每个方法,我都不想每次调用该方法时都要检查什么。
目前,我的工作如下:
if(IsDataBaseStream())
Database::execQuery("SELECT * from table");
else //is FileStream
File::GetAllFrom("Table");
这很丑。我拒绝这样做。
我考虑过回调,但这在不同的类之间不起作用。
有没有一种不浪费处理器工作的方法?
提前致谢
最佳答案
您应该使用Strategy Design Pattern。给这两个类一个通用的基,并使用抽象方法来获取数据,创建指向该基类的指针,然后在一次检查后为该指针分配基于文件或基于db的实现。
struct BaseStream {
virtual void process();
};
struct FileStream : public BaseStream {
virtual void process() {
File::GetAllFrom("Table");
}
};
struct DBStream : public BaseStream {
virtual void process() {
Database::execQuery("SELECT * from table");
}
};
...
BaseStream *s;
if (IsDataBaseStream()) {
s = new DBStream;
} else {
s = new FileStream;
}
...
s -> process();