3

我有两个类,一个负责从数据库中获取数据(已经实现),另一个负责从文件中获取数据(现在正在实现)。这里的事情是我希望能够切换流式传输(数据库或文件)。检查是数据库还是文件的过程只需要一次。因此,对于类中的每个方法,我不想每次都检查调用该方法时应该使用什么。现在,我执行以下操作:

if(IsDataBaseStream())
    Database::execQuery("SELECT * from table");
else //is FileStream
    File::GetAllFrom("Table");

这很丑陋。我拒绝这样做。我考虑过回调,但这在不同的类之间不起作用。

有没有办法不浪费这样的处理器工作?

提前致谢

4

1 回答 1

10

您应该使用策略设计模式。为这两个类提供一个公共基础,并使用一个抽象方法获取数据,创建一个指向该基类的指针,然后在一次检查后为该指针分配一个基于文件或基于数据库的实现。

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();
于 2013-01-10T20:20:22.310 回答