---
title: 20240215_社内勉強会_白井亜紀裕
tags: 
author: [株式会社ビヨンド](https://www.docswell.com/user/beyond24365)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/4JM4XRQ97W.jpg?width=480
description: 社内勉強会の資料です。 Strategyパターンについてまとめています。
published: May 31, 24
canonical: https://www.docswell.com/s/beyond24365/KJL3W1-2024-05-31-155329
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/4JM4XRQ97W.jpg)

Strategyパターン
Webサービス事業部
白井 亜紀裕


# Page. 2

![Page Image](https://bcdn.docswell.com/page/PJRWNR8979.jpg)

デザインパターンとは
オブジェクト指向の言語などでよく使用される再利用できる設計パターンのこと
多くのプログラマの経験則やベストプラクティスをまとめたもの
特定の問題や課題に対して解決策としてアプローチする手段になる


# Page. 3

![Page Image](https://bcdn.docswell.com/page/PEXPNR837X.jpg)

・Creational(初期化グループ)
・Structural(構造グループ)
・Behavioral (相互作用/行動/振る舞い)


# Page. 4

![Page Image](https://bcdn.docswell.com/page/3EKDNRKNJD.jpg)

なぜデザインパターンが必要(有用)なのか
☑ コードの再利用性の向上
☑ 拡張が簡単
☑ 保守性の向上
☑ 共通の技術→コミュニケーションやスピードの促進


# Page. 5

![Page Image](https://bcdn.docswell.com/page/L73RV8ZZJ5.jpg)

Strategyパターンとは
Strategy 英語で「戦略」を意味
いろんな「戦略」を事前に定義し、
場面によって「戦略」の切り替えが簡単に行えるようになるデザインパターン


# Page. 6

![Page Image](https://bcdn.docswell.com/page/87DY8MR47G.jpg)

構造
Strategy
「戦略」を利用する為のイン
ターフェイス
共通のインターフェイス約
束事をここで定義
ConcreteStrategy
Context
Strategyによって
定められた
インターフェイスに則り実装
ConcreteStrategyを
Strategyを介して利用
ここが「戦略」部分
「戦略」を切り替えたり
クライアントと「戦略」を接続
するクラス


# Page. 7

![Page Image](https://bcdn.docswell.com/page/VJP68RWVE8.jpg)



# Page. 8

![Page Image](https://bcdn.docswell.com/page/2EV3NR8R7Q.jpg)

いつ使うべきか？
☑ アルゴリズムの「やること」は同じで
方」が違う場合、変えたい場合
☑ 物理的制限を考慮して実装する時
☑ メソッドの振る舞いをif/elseで
分岐して実装しているときなど
「やり


# Page. 9

![Page Image](https://bcdn.docswell.com/page/57G3KM56JL.jpg)

使用例
Zip,RARなどの異なる画像圧縮アルゴリズムを持つ画像圧縮処理を実装
圧縮処理をStrategyパターンで「戦略化」して、切り替えや再利用化
【具体的な手順】
☑ 異なる圧縮処理に対応するConcreteStrategy(戦略)を作成
☑ Compression Storategyというインターフェイス(約束事)を定義
☑ これらを切り替えるImageProcesserというContextを作成


# Page. 10

![Page Image](https://bcdn.docswell.com/page/4EQ5NRZ2JP.jpg)

使用したい戦略を
選択・切替
異なる戦略が「圧縮」とい
う共通のメソッドを持つた
めの契約
各形式の圧縮処理


# Page. 11

![Page Image](https://bcdn.docswell.com/page/KJ49G83P71.jpg)

Strategyパターン使用
未使用で実装
☑ 拡張性・柔軟性が増す
☒ コードが冗長化しやすい
☑ 保守性の向上
☒ コードが複雑化しやすい
☑ アルゴリズムのカプセル化
☒ 保守・柔軟性の低下
☑ 単体テストの容易性向上
☒ 再利用性の低下


# Page. 12

![Page Image](https://bcdn.docswell.com/page/LE1KD21XJG.jpg)

学びながらの疑問
🤔 サブクラスで十分では？
switch文やif/elseなどの条件分岐じゃダメなの？
➥ 変更に弱い
コードが具体的なクラスや条件分岐に依存
Strategyパターンを使用することで
抽象化されたインターフェイスを通じて
コードと具体的な実装が分離→変更への影響が最小限


# Page. 13

![Page Image](https://bcdn.docswell.com/page/GEWDYR8KJ2.jpg)

結論
・ゴール(目指す結果)は決まっているがアルゴリズム(過程)が違う
または切り替えたい時に非常に効果的なパターン
・特にアルゴリズムをプログラムから切り離して管理するので
変化に対してより強く・柔軟になる
➥これらを実現するのがStrategyパターンという手段
コードの


# Page. 14

![Page Image](https://bcdn.docswell.com/page/47ZGXR8NE3.jpg)

Strategyパターンに触れてみて
・保守性や変更について考えるきっかけになった
・時と場合は考えて使わなければいけないが
要所で使用すると効果的な技術だと感じました
・総じて「管理」が楽になる。
・他デザインパターンの興味も湧いた


# Page. 15

![Page Image](https://bcdn.docswell.com/page/YJ6Y4RP97V.jpg)

ご清聴ありがとうございました
Webサービス事業部
白井 亜紀裕


# Page. 16

![Page Image](https://bcdn.docswell.com/page/GJ5GQ8KDJ4.jpg)

参考資料
https://qiita.com/victory1011/items/6d75da6c77d3e1884864
https://qiita.com/hankehly/items/1848f2fd8e09812d1aaf
https://qiita.com/a1146234/items/fdecc374b7225d99ab07


