0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

デザインパターン学習メモ:「Strategy」

Last updated at Posted at 2017-05-28

目的

GoF本より引用する。

アルゴリズムの集合を定義し、各アルゴリズムをカプセル化して、それらを交換可能にする。Strategyパターンを利用することで、アルゴリズムを、それを利用するクライアントからは独立に変更することができるようになる。

Stateパターンとよく似ている。
http://qiita.com/mokrai/items/2caf83112c4b92d2ebe7

実装例

3つの数の足し算を行う。二つの計算アルゴリズムを用意する。一つは普通に掛け算する方法。もう一つは、足し算をループして非効率的に計算する方法。

MultiplicationContext.java
// Context役
public class MultiplicationContext {
	private Multiplication strategy;

	public MultiplicationContext(Multiplication stratagy) {
		this.strategy = stratagy;
	}

	public int calculate(int l, int m, int n) {
		return strategy.calculate(l, m, n);
	}
}
Multiplication.java
// Strategy役
// 掛け算をする
public interface Multiplication {
	int calculate(int l, int m, int n);
}
NomalMultiplication.java
// ConcreteStrategy役
public class NomalMultiplication implements Multiplication {

	// ふつうに計算する
	@Override
	public int calculate(int l, int m, int n) {
		return l * m * n;
	}
}
MultiplicationByAddition.java
//ConcreteStrategy役
public class MultiplicationByAddition implements Multiplication {

	// 足し算のループで非効率な計算
	@Override
	public int calculate(int l, int m, int n) {
		int sum = 0;
		for (int i = 0; i < n; i++) {
			int intermediateResult = 0;
			for (int j = 0; j < m; j++) {
				intermediateResult += l;
			}
			sum += intermediateResult;
		}
		return sum;
	}
}

実行例

Main.java
public class Main {
	public static void main(String[] args) {
		MultiplicationContext contextA = new MultiplicationContext(new NomalMultiplication());
		int resultA = contextA.calculate(200,300,400);
		System.out.println(resultA);
		
		MultiplicationContext contextB = new MultiplicationContext(new MultiplicationByAddition());
		int resultB = contextB.calculate(200,300,400);
		System.out.println(resultB);
	}
}
結果
24000000
24000000

参考文献

  • エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース(1999)『オブジェクト指向における再利用のためのデザインパターン 改訂版』本位田 真一、吉田 和樹 監訳、SBクリエイティブ
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?