3

私は2つのクラスを持っています。1つはデータベースからデータを取得するすべての作業を行い(すでに実装されています)、もう1つはファイルからデータを取得します(現在実装中)。ここで重要なのは、ストリーミング (データベースまたはファイル) を切り替えられるようにしたいということです。データベースかファイルかをチェックするプロセスは一度だけ必要です。したがって、クラスの各メソッドについて、このメソッドが呼び出されたときに何を使用する必要があるかを毎回確認したくありません。今のところ、私は次のようにします:

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

これは醜いです。私はこれを拒否しています。コールバックについて考えましたが、それは異なるクラス間では機能しません。

そのようなプロセッサの作業を無駄にしない方法はありますか?

前もって感謝します

4

1 に答える 1

10

Strategy Design Patternを使用する必要があります。両方のクラスに、データを取得する抽象メソッドを使用して共通のベースを与え、そのベース クラスへのポインターを作成し、1 回のチェック後にファイル ベースまたは 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();
于 2013-01-10T20:20:22.310 に答える