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++】C++で開発することのメリット/デメリット

C++は多くの利点を持つ強力なプログラミング言語ですが、一方でいくつかのデメリットもあります。 以下に、C++で開発することのメリットとデメリットを詳細に説明します。   メリット 1. パ …

【C++】Day 7:ユーザー定義関数とライブラリ関数について

Day 7では、ユーザー定義関数とライブラリ関数について学習します。 以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。   ユーザー定義関数: – ユーザー定義関 …

【C++】Day 14:C++における文字列操作

Day 14では、C++における文字列操作について学習します。 C++では標準ライブラリである`<string>`を使用して、文字列を操作することができます。 以下に文字列操作の主な内容と …

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

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

【C++】Day 13:メモリ管理とスマートポインタ

Day 13では、メモリ管理とスマートポインタについて学習します。 C++では、メモリの確保と解放を適切に行うことが重要です。スマートポインタは、メモリの自動管理を行う便利な機能です。 以下にそれぞれ …