🛳️

デザインパターン:Strategyパターン

2024/07/19に公開

これは何?

たくさんの戦術を持てる戦略家

同じことを異なる方法(アルゴリズム)で実現する時のパターン

何が嬉しいのか

if文地獄を解消できる

問題

ある日、僕は痩せるために今よりも毎日A[kcal]多く削減できれば目標を達成できると閃いた

A[kcal]削減するための方法を毎日気分で変えたいから、痩せ提案アプリを作ろう!

ランニングだったらxx[分]走れば良いし、縄跳びだったらyy[分]やれば良いな、あと他の方法だったら…

type yaseruWay = 'Running' | 'Nawatobi'

function yaseruzo(kcal: number, way: yaseruWay) {
	console.log('メニューハ...')
	switch(way){
		case 'Running':
			// kcal消費するために必要な分数を決めるロジック(ランニング用)
			console.log('xx[分]走る')
			break;
		case 'Nawatobi':
			// kcal消費するために必要な分数を決めるロジック(縄跳び用)
			console.log('yy[回]跳ぶ')
			break
	}
	console.log('ファイト')
}

「痩せ知識の増加と共にyaseruzo関数がどんどん太りそう」

解決

「痩せStrategyを作れば解決だ」

interface YaseStrategy {
	makeMenu(kcal: number): void
}

class RunningStrategy implements YaseStrategy {
	makeMenu(kcal: number){
		// ロジック
		console.log('xx[分]走る')
	}
}

class NawatobiStrategy implements YaseStrategy {
	makeMenu(kcal: number){
		// ロジック
		console.log('yy[回]跳ぶ')
	}
}

class SwimmingStrategy implements YaseStrategy{
	makeMenu(kcal: number){
		// ロジック
		console.log('zz[m]泳ぐ')
	}
}

class Context {
	private strategy: YaseStrategy

  constructor(strategy: YaseStrategy) {
      this.strategy = strategy;
  }
	
  setStrategy(strategy: YaseStrategy) {
      this.strategy = strategy;
  }

	makeExerciseMenu(kcal: number){
		console.log('メニューハ...')
		this.strategy.makeMenu(kcal)
		console.log('ファイト')
	}
}

const context = new Context(new RunningStrategy())
context.makeExerciseMenu(200)

context.setStrategy(new NawatobiStrategy())
context.makeExerciseMenu(200)

これで知識が増えても安心

その他の推しポイント

  • テストしやすい
  • 不具合調査しやすい
  • 動的に動作を変更できる

動く実装例

https://www.typescriptlang.org/play?ssl=3&ssc=2&pln=1&pc=1#code/JYOwLgpgTgZghgYwgAgJpwM4QMpinSAcwE9kBvAKAEgBbOAawgFkIQBXACnoTgBsAuZOxoAjaAEpBANwD2wACYUAvhQoJemDMgBKbECFCFc+IqWA0ADrwg1WYLeizGCEEuWp1GLdlx4ChbKISlFRUAPRhyIC3DIAdDIDDDID1DNRUCDIgGDLWAHS8MoQcAOQAHkUA2oBgSgC6gA6xgNEMBeLUKiqq6prIAHJwAO4EMiLAzqbI5lY2dg6YOHgubiGezKyc3HyCwmJQ4iHhkbGJyanpmRA5eYXExKWAe2qVgM+xgG4MDU3KrRoYWtjd5jSGQ65mlmstnAkycM1M8wYix8K3862CyQi0XiSVChwy2Vy+QKAC8caUaJVAM82gAUGJ5UZqvdoAYTSkCKYHcVAsUGAUhcyAw4P+gkc0xM-1UyGQ6LwbAQYBkUA4XIFJF5Uz+JHE7mFauQYAAFsAMFlZbNSABeTnckgAbgowpUVEtnIgYCVxBlpuICrBcuIKso6uFWp1epdyGN+tMFqtqloUIAokVoAgddDln41oENlsDmkMScsYVAEn-gDD-wC2-4AHf8AUf9ZCvkqh+3Uh-5ZBbeJN8RpozPHU7YwAx-4Bzf8ATv+AEP-yZS1JnGYd6YzjSAIN1kLTwBAGRwZ3PdPpfi6OOJGhOl2AG9HY1B41gmxwAEwABivjVHi4ZevtjpXs86PT6AxfO-vk8PjBjOME3Pa9byAA

Tokyo, inc. Engineers

Discussion