Post

Strategy Pattern

Strategy Pattern ์ •๋ฆฌ

์ƒํ™ฉ

๊ธฐ์กด์˜ ์ƒ์œ„ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ, ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋“ค์ด ์žˆ์„ ๋•Œ, ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€ ํ˜น์€ ์‚ญ์ œ ๋“ฑ์˜ ๋ณ€ํ™”๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚  ๋•Œ ์ „๋žตํŒจํ„ด์„ ์ ์šฉํ•œ๋‹ค.

ex) Duck ํด๋ž˜์Šค์— fly()๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ คํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ช‡๋ช‡ ๋‚ ์ง€ ๋ชปํ•˜๋Š” ์˜ค๋ฆฌ๋“ค(ํ•˜์œ„ ํด๋ž˜์Šค)๋„ ๋‚ ์•„๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

ํฌ์ธํŠธ

๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์€ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์บก์Аํ™”ํ•œ๋‹ค. ๊ตฌํ˜„๋ณด๋‹ค๋Š” โ€œํ–‰๋™โ€์— ์ดˆ์ฒจ์„ ๋งž์ถฐ ์„ค๊ณ„ํ•œ๋‹ค. ์ฆ‰, ์ƒ์†์€ ๋งŽ์€ ์žฅ์ ์ด ์žˆ์ง€๋งŒ ์—ฌ๋Ÿฌ ๋‹จ์  ๋˜ํ•œ ์กด์žฌํ•œ๋‹ค. ์•ž์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ƒ๊ด€์—†์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ผ์ด ๋งŽ๋‹ค๋ฉด ์ƒ์†์— ๋ฌถ์—ฌ ๊ฐœ๋ฐœํ•˜๊ธฐ ํž˜๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ํ–‰๋™์— ์ดˆ์ ์„ ๋งž์ถฐ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค๊ณ„ํ•œ๋‹ค.

์˜ˆ์‹œ

์ด์ œ, ์˜ˆ์‹œ ์ƒํ™ฉ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž. ์œ„์˜ ๋ฌธ์ œ๋Š” ๋ช‡๋ช‡์˜ค๋ฆฌ๋Š” ๋‚  ์ˆ˜ ์—†๋Š”๋ฐ, Fly method๋ฅผ duck(์ƒ์œ„ ํƒ€์ž…)์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์ธ Fly๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. ํŠน์ • ์˜ค๋ฆฌ๋Š” ๋‚ ์ง€์•Š๊ณ , ํŠน์ • ์˜ค๋ฆฌ๋Š” ๋‚  ์ˆ˜ ์žˆ๋‹ค. ์ด์— FlyBeHavior() ๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋ถ„๋ฆฌํ•˜๊ณ , ์ด๋ฅผ Duck ํด๋ž˜์Šค์— ๊ตฌ์„ฑํ•œ๋‹ค.(State, ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ๋‘”๋‹ค.) ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด Fly๋ผ๋Š” ํ–‰๋™์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜(ํด๋ž˜์Šค)๋ฅผ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ์˜ค๋ฆฌ๋Š” ์ž์‹ ์—๊ฒŒ ๋งž๋Š” Fly ํ–‰๋™์„ ๋™์ ์œผ๋กœ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    performFly() {
        flyBehavior.fly();
    }

    performQuack() {
        quackBehavior.quack();
    }

    abstract display();
}

FlyBehavior์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋“ค์˜ ์˜ˆ์‹œ๋„ ๊ฐ™์ด ํ™•์ธํ•ด๋ณด์ž

1
2
3
4
5
public class FlyWithWings implements FlyBehavior {
    fly() {
        System.out.println("I'm flying!");
    }
}

์œ„์™€ ๊ฐ™์ด ํ–‰๋™์˜ ์ƒ์œ„์ˆ˜์ค€์„ ์ •์˜ํ•˜๊ณ , ํ–‰๋™(์ „๋žต)์„ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•œ ๋’ค, ๊ฐ์ฒด๋“ค์€ ์ด ํ–‰๋™๋“ค์„ ํฌํ•จ(State)ํ•˜์—ฌ ํ–‰๋™์„ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์„ ์ „๋žต ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ „๋žต ํŒจํ„ด์ด๋ž€?

์•Œ๊ณ ๋ฆฌ์ฆ˜(๋ฉ”์†Œ๋“œ)์˜ ์ƒ์œ„ ์ˆ˜์ค€์„ ์ •์˜ํ•˜๊ณ , ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ณ„๋„์˜ ํด๋ž˜์Šค์— ๋„ฃ์€ ํ›„ ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ํ–‰๋™์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ „์Ÿ ๊ฒŒ์ž„์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ๊ณต๊ฒฉ๊ณผ ๊ด€๋ จ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ƒ์œ„ ์ˆ˜์ค€์€ Attack ์ผ ๊ฒƒ์ด๋‹ค. ์นผ๋กœ ๊ณต๊ฒฉ, ์ €๊ฒฉ, ํ™”ํฌ ๋ฐœ์‚ฌ, ํ™”์‚ด ๊ณต๊ฒฉ ๋“ฑ์€ ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ•ด๋‹นํ•œ๋‹ค. ์ฆ‰ Attack strategy์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‘๊ณ , sword, gun ๋“ฑ์˜ ํ•˜์œ„ ๋ฐฉ๋ฒ•์„ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•œ๋‹ค.

When?

ํ•˜๋‚˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜(method)์— ๋Œ€ํ•ด ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•์ด ํ•„์š”ํ•  ๋–„, ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

ex) ์—ฐ์‚ฐ์ด๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋”ํ•˜๊ธฐ, ๋นผ๊ธฐ, ๊ณฑํ•˜๊ธฐ, โ€ฆ. ์ œ๊ณฑ, ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ, ํ•˜๋‚˜์˜ behavior(ex. ์—ฐ์‚ฐ)์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹จ์ˆœํ•œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ดํ›„ ์—ฌ๋Ÿฌ ๋ณ€ํ˜•์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ด๋ฅผ ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์˜ฎ๊ธฐ๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€ํ˜•(ํด๋ž˜์Šค)๋กœ ๋ฐ”๊พผ๋‹ค.

  1. ์ „๋žต์ด๋ผ๋Š” interface๋ฅผ ์ƒ์„ฑ(ex. ์—ฐ์‚ฐ ํ–‰์œ„)
  2. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” class ์ƒ์„ฑ(ex. ๋”ํ•˜๊ธฐ ํ–‰์œ„)

~๋ฅผ ์ƒ์†ํ•˜๋‹ค. Aggressive : ์—ฌ๊ธฐ์— ๋‚ด๊ฒƒ์ด ์žˆ๋‹ค.

https://refactoring.guru/ko/design-patterns

[์ถœ์ฒ˜: https://refactoring.guru/ko/design-patterns]

flying behavior, quacking behavior๊ฐ€ ์ „๋žตํŒจํ„ด, Duck์ด ์ „๋žตํŒจํ„ด์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ๋‹ค.

์žฅ๋‹จ์ 

์žฅ์ 

  • ์ƒ์†์„ ํ•ฉ์„ฑ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ(๊ฐ•ํ•œ ์˜์กด๋„ ๋‚ฎ์ถค)
  • ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค๋ฅผ ํฌ๊ฒŒ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Œ

๋‹จ์ 

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ช‡๊ฐœ ์—†๊ณ , ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ตณ์ด ๋ณต์žก๋„๋ฅผ ํ‚ค์šธ ํ•„์š”๊ฐ€ ์—†์Œ

์Šคํƒ€ํฌ๋ž˜ํ”„ํŠธ

ํ…Œ๋ž€์„ ๊ธฐ์ค€์œผ๋กœ ์บ๋ฆญํ„ฐ๋“ค์— ์ „๋žตํŒจํ„ด์„ ์ ์šฉํ•ด๋ณด์ž.

  • ๋งˆ๋ฆฐ(์ง€์ƒ): ์ง€์ƒ, ํ•˜๋Š˜ ๊ณต๊ฒฉ๊ฐ€๋Šฅ
  • ํŒŒ์ด์–ด๋ฒณ(์ง€์ƒ): ์ง€์ƒ ๊ณต๊ฒฉ๋งŒ ๊ฐ€๋Šฅ
  • ๋ฒŒ์ฒ˜(์ง€์ƒ): ์ง€์ƒ ๊ณต๊ฒฉ๋งŒ ๊ฐ€๋Šฅ
  • ํƒฑํฌ(์ง€์ƒ): ์ง€์ƒ ๊ณต๊ฒฉ๋งŒ ๊ฐ€๋Šฅ
  • ๊ณจ๋ฆฌ์•—(์ง€์ƒ): ์ง€์ƒ, ํ•˜๋Š˜ ๊ณต๊ฒฉ๊ฐ€๋Šฅ
  • ๋ ˆ์ด์Šค(ํ•˜๋Š˜): ์ง€์ƒ, ํ•˜๋Š˜ ๊ณต๊ฒฉ๊ฐ€๋Šฅ
  • Moveable(์ธํ„ฐํŽ˜์ด์Šค)
    1. AtGroud
    2. Fly
  • Attack(์ธํ„ฐํŽ˜์ด์Šค)
    1. Ground
    2. Sky
    3. All(์ง€์ƒ, ํ•˜๋Š˜ ๊ณต๊ฒฉ ์œ ํ˜•์ด ๋‹ค๋ฅธ ๊ฒƒ๋„ ์—ฌ๊ธฐ์„œ ์ปค๋ฒ„)
This post is licensed under CC BY 4.0 by the author.