HiroLab

プログラミングに関する情報発信サイト。

C++

【C++】Day 28:デザインパターン「行動型パターン」

投稿日:

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. コマンドパターンを使って、テレビのリモコンで操作する電気機器を実装してください。電気機器のオン・オフなどの操作をコマンドとして表現し、履歴管理と取り消し機能をサポートしてください。

これらの例題と演習問題を解くことで、行動型パターンの理解と実践ができます。問題を解いたら、各パターンが正しく動作しているかどうかを確認してみてください。

-C++
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

【C++】Day 3:C++の演算子について

Day 3では、C++の演算子について学習します。 演算子はプログラム内で値を操作するための特殊な記号やキーワードです。 C++には様々な演算子が存在し、数値演算、論理演算、代入演算などがあります。以 …

【C++】30日間で体系的に学習するのに効果的なカリキュラム

C++を30日間で体系的に学習するための効果的なカリキュラムを以下に示します。 このカリキュラムは、基本的な概念から徐々に複雑なトピックに進み、実践的なプロジェクトを通じて学習を強化するアプローチを取 …

【C++】Day 9:クラスとオブジェクト

Day 9では、クラスとオブジェクトについて学習します。 以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。   クラスとオブジェクトの内容:   1. クラス: & …

【C++】Day 17:例外安全性とエラーハンドリング

Day 17では、例外安全性とエラーハンドリングについて学習します。 C++では、プログラムが例外(予期しないエラー状態)に遭遇した際に、そのエラーを適切に処理することが重要です。例外安全性は、プログ …

【C++】Day 30:C++の応用と展望

Day 30では、「C++の応用と展望」について学習します。 C++は非常にパワフルで柔軟なプログラミング言語であり、さまざまな応用分野で使用されています。この日は、C++の応用領域や将来の展望につい …