我有两个类,一个类完成了从数据库(已实现)获取数据的所有工作,另一个完成了从文件(现在正在实现)获取数据的所有工作。
这里的问题是我希望能够切换流式传输(数据库或文件)。仅需要一次检查数据库还是文件的过程。
因此,对于类中的每个方法,我都不想每次调用该方法时都要检查什么。
目前,我的工作如下:

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();

09-25 20:23