State/Strategyパターン

State/Strategyパターンは状態とか戦略とかのクラス化をするパターンです。
要するにインターフェースは同じままでアルゴリズムを取り替え可能にしましょって話。


複数のソートアルゴリズムを扱う場合の簡単過ぎる一例を書いておきます。
まぁこんな感じってことで。
なお、ソートアルゴリズムの記述は省略いたします。
なのでコピペしてもソートとは全く関係ないことしやがります。

準備するもの

・内部に(B)のポインタ(参照)を持ち、それをラップしたメソッドを実装したクラス(A)。
・(A)が(C)を利用するために使われるインターフェース(純粋仮想関数)を提供する仮想クラス(B)。
・(B)を継承し、純粋仮想関数の具体的なアルゴリズムを実装したクラス(C)。

解説

利用者は(A)のインスタンスを生成する際などに、使いたい(C)のインスタンスを渡す。
あとは(A)が提供するメソッドを用いて希望の処理を行う。

プログラム例(C++):

#include <iostream>
/* ソートクラスが実装すべきインターフェース */
class program_interface{
public:
    virtual int sort(int *data) = 0;
};
/* ソートクラス1 */
class sorter1 : public program_interface{
public:
    int sort(int *data){
        std::cout << "ソートアルゴリズムその1" << std::endl;
        return 0;
    }
};
/* ソートクラス2 */
class sorter2 : public program_interface{
public:
    int sort(int *data){
        std::cout << "ソートアルゴリズムその2" << std::endl;
        return 0;
    }
};
/* ソートクラス3 */
class sorter3 : public program_interface{
public:
    int sort(int *data){
        std::cout << "ソートアルゴリズムその3" << std::endl;
        return 0;
    }
};
/* 利用者用インターフェースクラス */
class user_interface{
public:
    int sort(int *data, program_interface *sorter){
        int result = 0;
        result = sorter->sort(data);
        delete sorter;
        return result;
    }
};
int main(){
    int dada[5] = { 1, 2, 3, 4, 5 };
    user_interface sorter;
    sorter.sort(dada, new sorter1);
    sorter.sort(dada, new sorter2);
    sorter.sort(dada, new sorter3);
    return 0;
}