パターンについて

Strategyパターンは交換可能な振舞いをカプセル化し、委譲を使って使用すべき振舞いを決定します。
主要な処理を行っているコードの中で一部動的に振舞いを変更させたい場合に利用し、
コードの中で動的に振舞い変更したい場合は、if文なので条件分岐しがちになりますが
Strategyを利用することで主要な処理に対して影響を与えず、1つのステートメントで動的な振舞いを定義することができます。

HeadFirstデザインパターンでの定義

一連のアルゴリズムを定義してそれぞれをカプセル化し、それらを交換可能にする。
Strategyパターンによって、アルゴリズムを使用するクライアントとは独立して、アルゴリズムを変更できる

パターン構造

strategy_pattern
構成要素
Context : インタフェース Strategy を利用するクラス。
Strategy : アルゴリズムに共通のインタフェース。Context オブジェクトはこのインタフェースを使用する。
ConcreteStrategy : インタフェース Strategy を実現する具象クラス。様々なアルゴリズムを実装する。

サンプル

鴨の鳴き方(振舞い)を動的に変える場合

・鳴き方インタフェース

1
2
3
public interface QuackBehavior {
public void quack();
}

・鳴き方1(ConcreteStrategyA)

1
2
3
4
5
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("ガーガー");
}
}

・鳴き方2(ConcreteStrategyB)

1
2
3
4
5
public class Squeak implements QuackBehavior {
public void quack() {
System.out.println("キューキュー");
}
}

・鴨クラス(Context)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Duck {
QuackBehavior quackBehavior;
public Duck() {
quackBehavior = new Quack();
}
public void performQuack() {
quackBehavior.quack();
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
}

・実行コード

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {
public static void main(String[] args) {
Duck duck = new Duck();
duck.performQuack();
model.setQuackBehavior(new Squeak());
duck.performQuack();
}
}
// 実行結果
// ガーガー
// キューキュー


X