Skip to content

Instantly share code, notes, and snippets.

@fujimisakari
Last active August 11, 2017 09:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fujimisakari/5797dfb18f4fc350e206eced83474d2e to your computer and use it in GitHub Desktop.
Save fujimisakari/5797dfb18f4fc350e206eced83474d2e to your computer and use it in GitHub Desktop.
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