State/Strategyパターン
State/Strategyパターンは状態とか戦略とかのクラス化をするパターンです。
要するにインターフェースは同じままでアルゴリズムを取り替え可能にしましょって話。
複数のソートアルゴリズムを扱う場合の簡単過ぎる一例を書いておきます。
まぁこんな感じってことで。
なお、ソートアルゴリズムの記述は省略いたします。
なのでコピペしてもソートとは全く関係ないことしやがります。
準備するもの
・内部に(B)のポインタ(参照)を持ち、それをラップしたメソッドを実装したクラス(A)。 ・(A)が(C)を利用するために使われるインターフェース(純粋仮想関数)を提供する仮想クラス(B)。 ・(B)を継承し、純粋仮想関数の具体的なアルゴリズムを実装したクラス(C)。
プログラム例(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; }