Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Strategyパターン

Strategyパターン

HeadFirstデザインパターン Index

パターンについて

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

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

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

パターン構造

strategy_pattern

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

サンプル

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

鳴き方インタフェース

public interface QuackBehavior {
	public void quack();
}

鳴き方1(ConcreteStrategyA)

public class Quack implements QuackBehavior {
	public void quack() {
		System.out.println("ガーガー");
    }
}

鳴き方2(ConcreteStrategyB)

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

鴨クラス(Context)

public class Duck {

	QuackBehavior quackBehavior;

	public Duck() {
		quackBehavior = new Quack();
	}

	public void performQuack() {
		quackBehavior.quack();
	}

	public void setQuackBehavior(QuackBehavior qb) {
		quackBehavior = qb;
	}
}

実行コード

public class Client {

	public static void main(String[] args) {
		Duck duck = new Duck();
		duck.performQuack();
		model.setQuackBehavior(new Squeak());
		duck.performQuack();
	}
}

// 実行結果
// ガーガー
// キューキュー
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.