🛳️
デザインパターン:Strategyパターン
これは何?
たくさんの戦術を持てる戦略家
同じことを異なる方法(アルゴリズム)で実現する時のパターン
何が嬉しいのか
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)
これで知識が増えても安心
その他の推しポイント
- テストしやすい
- 不具合調査しやすい
- 動的に動作を変更できる
動く実装例
Discussion