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 6:関数について

Day 6では、関数について学習します。 関数は、プログラム内で特定のタスクを実行するために使用されるブロック(サブルーチン)です。関数はメインプログラムから呼び出すことができ、再利用性とコードの構造 …

【C++】Day 10:継承とポリモーフィズム

Day 10では、継承とポリモーフィズムについて学習します。 以下にそれぞれの内容を詳細に説明します。   継承: 1. 継承の概念: – 継承は、既存のクラス(ベースクラスまた …

【C++】Day 19:マルチスレッドプログラミングにおける同期と通信の重要性

Day 19では、マルチスレッドプログラミングにおける同期と通信の重要性について学習します。 マルチスレッドプログラムでは複数のスレッドが同時に動作するため、スレッド同士が競合状態になる可能性がありま …

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

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

【C++】Day 21:ネットワークプログラミングの基礎

Day 21では、ネットワークプログラミングの基礎について学習します。 ネットワークプログラミングは、コンピュータ間でデータを送受信するプログラミングのことを指します。主にソケットを使用してネットワー …