Day 28では、デザインパターンのうち「行動型パターン」について学習します。
行動型パターンは、オブジェクト間の相互作用や責任の分担に関するパターンです。主な行動型パターンには、ストラテジ、オブザーバ、コマンド、イテレータ、テンプレートメソッドなどがあります。
以下に行動型パターンの主な内容と、例題、演習問題を提示します。
行動型パターンの主な内容:
1. ストラテジパターン:
– ストラテジパターンは、同じ目的を持つ異なるアルゴリズムを定義し、実行時に切り替えられるようにするパターンです。
– アルゴリズムの変更に柔軟に対応できます。
2. オブザーバパターン:
– オブザーバパターンは、オブジェクト間の依存関係を定義し、一方のオブジェクトの状態が変化した際に依存するオブジェクトに通知するパターンです。
– イベントの発行と購読を実現します。
3. コマンドパターン:
– コマンドパターンは、要求をオブジェクトとしてカプセル化し、実行や取り消しをサポートするパターンです。
– アクションをコマンドとして表現することで、履歴管理や実行の遅延が可能になります。
4. イテレータパターン:
– イテレータパターンは、コレクションの要素に順番にアクセスする方法を提供するパターンです。
– コレクションの内部構造を知らずに要素にアクセスできます。
5. テンプレートメソッドパターン:
– テンプレートメソッドパターンは、アルゴリズムの骨格を定義し、一部のステップをサブクラスに委譲するパターンです。
– アルゴリズムの一部の動作をカスタマイズする場合に有効です。
例題:
ストラテジパターンの例として、異なるソートアルゴリズムを使って整数のリストをソートするプログラムを考えてみましょう。
#include <iostream> #include <vector> #include <algorithm> // ソートストラテジの抽象クラス class SortStrategy { public: virtual void sort(std::vector<int>& data) = 0; virtual ~SortStrategy() = default; }; // バブルソートストラテジ class BubbleSortStrategy : public SortStrategy { public: void sort(std::vector<int>& data) override { std::cout << "Bubble Sort" << std::endl; std::sort(data.begin(), data.end()); } }; // クイックソートストラテジ class QuickSortStrategy : public SortStrategy { public: void sort(std::vector<int>& data) override { std::cout << "Quick Sort" << std::endl; std::sort(data.begin(), data.end(), [](int a, int b) { return a < b; }); } }; // ソートを実行するクラス class Sorter { private: SortStrategy* strategy; public: Sorter(SortStrategy* strategy) : strategy(strategy) {} void setStrategy(SortStrategy* strategy) { this->strategy = strategy; } void performSort(std::vector<int>& data) { strategy->sort(data); } }; int main() { std::vector<int> data = {5, 2, 8, 3, 1}; Sorter sorter(new BubbleSortStrategy()); sorter.performSort(data); sorter.setStrategy(new QuickSortStrategy()); sorter.performSort(data); return 0; }
演習問題:
1. オブザーバパターンを使って、ニュース記事の更新を通知するニュースサイトを実装してください。ニュース記事の更新を購読しているユーザーに対して通知を送信してください。
2. コマンドパターンを使って、テレビのリモコンで操作する電気機器を実装してください。電気機器のオン・オフなどの操作をコマンドとして表現し、履歴管理と取り消し機能をサポートしてください。
これらの例題と演習問題を解くことで、行動型パターンの理解と実践ができます。問題を解いたら、各パターンが正しく動作しているかどうかを確認してみてください。