動作に関する GoF (Gang of Four) パターンは、オブジェクトのアルゴリズムとオブジェクト間の責任の割り当てに関連します。また、動作パターンはこれらのオブジェクト間のコミュニケーションにも対応し、オブジェクト同士の相互接続を表します。この相互接続には、継承やタスクの実行も含まれることがあります。
次の表で動作に関する GoF パターンについて説明します。
| パターン名 | 対応する設計上の問題 | ロール | 説明 |
|---|---|---|---|
| Chain of Responsibility | 複数のオブジェクトに要求を処理できる機会を与えることで、要求を送信するオブジェクトと要求を受信するオブジェクトが結合されるのを回避できます。要求を受信する複数のオブジェクトをチェーン状につなぎ、あるオブジェクトがその要求を処理するまで、そのチェーンに沿って要求を渡していきます。 | Handler | 特定の要求に使用される抽象インタフェースを定義します。 |
| ConcreteHandler | Handler インタフェースに宣言された操作を実装します。 | ||
| Client | Concrete Handler を介して通信を開始します。 | ||
| Command Pattern | 要求をオブジェクトとしてカプセル化すると、異なる要求を持つクライアントをパラメータで表すことができます。要求を待ち行列に置くことやログに記録することもでき、取り消し可能な操作もサポートします。 | コマンド | 操作を実行するための抽象インタフェースを定義します。 |
| ConcreteCommand | Command インタフェースに宣言された操作を実装します。 | ||
| Client | ConcreteCommand オブジェクトを作成します。 | ||
| Invoker | Command 派生オブジェクトに定義されたインタフェースを実行します。 | ||
| Receive | 要求された操作の具象的な実装を実行します。 | ||
| Interpreter | 指定された言語の文法表現を定義します。インタプリタはこの表現を使用して対象言語の文を解釈します。 | AbstractExpression | 抽象構文ツリーのすべてのノードに実装する必要がある抽象解釈操作を定義します。 |
| TerminalExpression | 文法の終端記号だけに関連付けられている解釈操作の具象的な実装を提供します。 | ||
| NonterminalExpression | 文法の非終端記号だけに関連付けられている解釈操作の具象的な実装を提供します。 | ||
| Iterator | コレクション内の異なる要素にアクセスする際に、要素の特定の実装詳細を公開せずにアクセスするための均一的な機構を提供します。 | Iterator | 要素へのアクセスに使用する抽象インタフェースを定義します。 |
| ConcreteIterator | Iterator インタフェースに宣言された操作を実装します。 | ||
| Aggregate | ConcreteIterator オブジェクト作成に使用する抽象インタフェースを定義します。 | ||
| ConcreteAggregate | Aggregate インタフェースに宣言された操作を実装します。 | ||
| Mediator | コレクション内の異なる要素にアクセスする際に、要素の特定の実装詳細を公開せずにアクセスするための均一的な機構を提供します。 | Iterator | 要素へのアクセスに使用する抽象インタフェースを定義します。 |
| Concrete Iterator | Iterator インタフェースに宣言された操作を実装します。 | ||
| Aggregate | ConcreteIterator オブジェクト作成に使用する抽象インタフェースを定義します。 | ||
| Concrete Aggregate | Aggregate インタフェースに宣言された操作を実装します。 | ||
| Memento | オブジェクトを後からこの状態に復元できるように、オブジェクトの内部状態を取り込んで外面化できます。これによってオブジェクトのカプセル化が壊れることはありません。 | Memento | 特定の時点での Originator の状態を管理するオブジェクトです。 |
| Originator | 現在のコンテキストに必要な状態情報を提供し、Memento オブジェクトを作成します。 | ||
| Caretaker | Memento オブジェクトを集約します。 | ||
| Observer | オブジェクト間に 1 対多の依存関係が定義されます。1 つのオブジェクトの状態が変わると、そのすべての依存関係は自動的に通知を受けて更新されます。 | Subject | この Subject オブジェクトにさまざまな Observer を付加するために使用する抽象インタフェースを定義します。 |
| Observer | Observer が監視している Subject オブジェクトの更新に使用される抽象インタフェースを定義します。 | ||
| ConcreteSubject | Subject インタフェースに宣言された操作を実装します。 | ||
| ConcreteObserver | Observer インタフェースに宣言された操作を実装します。 | ||
| State | オブジェクトの内部状態が変化したときに自身の動作を変更できるようにする機構を提供します。 | Context | Context の状態にアクセスするためにクライアントが使用するインタフェースを定義します。 |
| State | ConcreteState によって実装される必要がある抽象インタフェースを定義します。これはドメイン固有のインタフェースです。 | ||
| ConcreteState | State インタフェースに宣言された操作を実装します。 | ||
| Strategy | アルゴリズムの集合が定義されます。各アルゴリズムはカプセル化され、互換性があります。アルゴリズムは、使用されるクライアントとは無関係に変更できます。 | Strategy | ConcreteStrategy オブジェクトによって実装される抽象インタフェースを定義します。 |
| ConcreteStrategy | Strategy インタフェースに宣言された操作を実装します。 | ||
| Context | Strategy インタフェースを実装するオブジェクトを集約します。 | ||
| TemplateMethod | 操作にアルゴリズムのスケルトンが定義されます。その一部の手順はサブクラスに据え置かれます。サブクラスでは、アルゴリズムの構造を変更せずに特定の手順を再定義できます。 | AbstractClass | さまざまな操作を定義します。これらの操作は ConcreteClass で上書きできます。 |
| ConcreteClass | AbstractClass に定義された特定の操作を実装します。 | ||
| Visitor | Visitor は、オブジェクト構造の要素に対して実行される操作を表します。操作の対象となる要素のクラスを変更しなくても新しい操作を定義できます。 | Visitor | 具象要素に特定の操作を提供し、この Visitor オブジェクトが各要素にアクセスできるようにします。 |
| ConcreteVisitor | Visitor インタフェースに宣言された操作を実装します。 | ||
| Element | Accept 操作を宣言します。この操作により、Visitor オブジェクトは現在の要素を処理できます。 | ||
| ConcreteElement | Element インタフェースに宣言された操作を実装します。 | ||
| ObjectStructure | ConcreteVisitor オブジェクトと、ConcreteElement オブジェクト間のコラボレーションを管理します。 |