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. ์ฐ์ฐ)์ด ๋ณํ์ง ์๋๋ค๋ฉด ๋จ์ํ ํจํด์ ์ฌ์ฉํ๋ค. ์ดํ ์ฌ๋ฌ ๋ณํ์ด ํ์ํ๋ค๋ฉด, ์ด๋ฅผ ํ๋์ ์ธํฐํ์ด์ค๋ก ์ฎ๊ธฐ๊ณ ์ฌ๋ฌ ๊ฐ์ ๋ณํ(ํด๋์ค)๋ก ๋ฐ๊พผ๋ค.
- ์ ๋ต์ด๋ผ๋ interface๋ฅผ ์์ฑ(ex. ์ฐ์ฐ ํ์)
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ class ์์ฑ(ex. ๋ํ๊ธฐ ํ์)
~๋ฅผ ์์ํ๋ค. Aggressive : ์ฌ๊ธฐ์ ๋ด๊ฒ์ด ์๋ค.
[์ถ์ฒ: https://refactoring.guru/ko/design-patterns]
flying behavior, quacking behavior๊ฐ ์ ๋ตํจํด, Duck์ด ์ ๋ตํจํด์ผ๋ก ๋ง๋ค์ด์ง ํด๋์ค๋ฅผ ์ด์ฉํ๋ค.
์ฅ๋จ์
์ฅ์
- ์์์ ํฉ์ฑ์ผ๋ก ๋์ฒดํ ์ ์์(๊ฐํ ์์กด๋ ๋ฎ์ถค)
- ํด๋ผ์ด์ธํธ ํด๋์ค๋ฅผ ํฌ๊ฒ ์์ ํ์ง ์๊ณ ๋ ์๋ก์ด ์๊ณ ๋ฆฌ์ฆ์ ๋์ ํ ์ ์์
๋จ์
- ์๊ณ ๋ฆฌ์ฆ์ด ๋ช๊ฐ ์๊ณ , ๋ณํ์ง ์๋๋ค๋ฉด ๊ตณ์ด ๋ณต์ก๋๋ฅผ ํค์ธ ํ์๊ฐ ์์
์คํํฌ๋ํํธ
ํ ๋์ ๊ธฐ์ค์ผ๋ก ์บ๋ฆญํฐ๋ค์ ์ ๋ตํจํด์ ์ ์ฉํด๋ณด์.
- ๋ง๋ฆฐ(์ง์): ์ง์, ํ๋ ๊ณต๊ฒฉ๊ฐ๋ฅ
- ํ์ด์ด๋ฒณ(์ง์): ์ง์ ๊ณต๊ฒฉ๋ง ๊ฐ๋ฅ
- ๋ฒ์ฒ(์ง์): ์ง์ ๊ณต๊ฒฉ๋ง ๊ฐ๋ฅ
- ํฑํฌ(์ง์): ์ง์ ๊ณต๊ฒฉ๋ง ๊ฐ๋ฅ
- ๊ณจ๋ฆฌ์(์ง์): ์ง์, ํ๋ ๊ณต๊ฒฉ๊ฐ๋ฅ
- ๋ ์ด์ค(ํ๋): ์ง์, ํ๋ ๊ณต๊ฒฉ๊ฐ๋ฅ
- Moveable(์ธํฐํ์ด์ค)
- AtGroud
- Fly
- Attack(์ธํฐํ์ด์ค)
- Ground
- Sky
- All(์ง์, ํ๋ ๊ณต๊ฒฉ ์ ํ์ด ๋ค๋ฅธ ๊ฒ๋ ์ฌ๊ธฐ์ ์ปค๋ฒ)