์ ๋ต ํจํด์ด๋?
๊ฐ๋จํ ์๊ธฐํ๋ฉด ํ์ ๋๋ ๋์์ ํด๋์ค๋ก ์ ์ํ๊ณ ๋์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๊ฒ ํ๋ ํํด์ ๋งํ๋ค. ์กฐ๊ธ ๋ ํ๋ฉด, ๊ฐ์ฒด์ ํ์๋ฅผ ํด๋์ค๋ก ์ ์ํ๊ณ ์ ์ฌํ ๊ฒ๋ผ๋ฆฌ ๋ฌถ์ด(์บก์ํํ์ฌ) ๊ฐ์ฒด์ ํ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋ ๋ฐ๊ฟ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ์ด๋ก์จ ๋ก์ง ๋ณ๊ฒฝ์ด๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋ ์กฐ๊ธ ๋ ์ ์ฐํ๊ฒ ํ์ฅํ ์ ์๋ค.
์๋ฅผ ๋ค์ด๋ณด์
๊ตฐ์ฉ ๋ฏธ์ฌ์ผ์๋ ์ง๋๊ณต, ๊ณต๋๊ณต, ๋์ ์ฐจ์ฉ ๋ฏธ์ฌ์ผ ๋ฑ์ด ์๋ค. ๊ตฐ์ฉ ์์ฐ์ธ ํญ๊ฒฉ๊ธฐ(Bomber)๋ ๊ณต๋์ง ๋ฏธ์ฌ์ผ๊ณผ ๋์ ์ฐจ ๋ฏธ์ฌ์ผ์ ์ฌ์ฉํ๊ณ ์ ํฌ๊ธฐ(Fighter)์ ๊ฒฝ์ฐ๋ ๊ณต๋๊ณต ๋ฏธ์ฌ์ผ๊ณผ ๋์ ์ฐจ ๋ฏธ์ฌ์ผ์ ์ฌ์ฉํ๋ค. ์ค์ ๋ก๋ ์ฌ๋ฌ ๋ฌด๊ธฐ๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์๊ฒ ์ง๋ง ์ ๋ต ํจํด์ ์์๋ณด๊ธฐ ์ํด ๊ณต๊ฒฉํ ๋๋ง๋ค ๋ฏธ์ฌ์ผ ์ ํ์ ๋ณ๊ฒฝํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ฌ๊ธฐ์ ์ ๋ต(strategy)์ ๋ฏธ์ฌ์ผ์ด ๋๋ค. ๋ฏธ์ฌ์ผ ์ ๋ต์ ์บก์ํํ์ฌ ํด๋์ค๋ก ์ ์ํ๊ณ ๋ณ๊ฒฝ์ด ํ์ํ ๋๋ง๋ค ๋ฐ๊ฟ์ค ๊ฒ์ด๋ค. ์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํด๋ณด์.
๊ตฌ์กฐ ์ดํด๋ณด๊ธฐ
๋จผ์ ๊ตฌํํ ์ ๋ต ํจํด์ ๊ตฌ์กฐ๋ฅผ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํ์ธํด๋ณด์.
์ ๋ต ํจํด์ ์ ๋ต(strategy)์ด ๋๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ณ ์ด๋ฅผ ๊ตฌํํ์ฌ ์ฌ๋ฌ ์ข
๋ฅ์ ๋ฏธ์ฌ์ผ ์ ๋ต์ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์ ๋ต์ ์ฌ์ฉํ๋ ํญ๊ฒฉ๊ธฐ์ ์ ํฌ๊ธฐ๋ ํด๋์ค๋ก ์ ์ํ๋ค. ๋ฌผ๋ก ์ด๋ค์ ์ํผ ํด๋์ค๋ก Unit๋ฅผ ์์ํ๋ฉฐ ์ํผ ํด๋์ค์๋ ์ ๋ต์ ์ฌ์ฉํ๋
missileAttack ๋ฉ์๋๊ฐ ์ ์๋์ด ์๋ค.

์ฝ๋๋ก ๊ตฌํํด๋ณด๊ธฐ
์ ๋ต ํจํด์ ์๋ฐ(Java) ์ธ์ด๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํด๋ณด์.
๋จผ์ , ์ ๋ต(Strategy)๋ฅผ ์ ์ํ๋ค. ํ์๋ฅผ ๋ฌถ์ด ์บก์ํํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๋จผ์ ์ ์ํ๊ณ ๊ฐ ์ ๋ต ํด๋์ค๊ฐ ์ด๋ฅผ ๊ตฌํ(implements) ํ๋๋ก ํ๋ค.
public interface MissileStrategy {
void doAttack();
}
class AntiTankMissile implements MissileStrategy {
@Override
public void doAttack() {
// ๋์ ์ฐจ ๋ฏธ์ฌ์ผ
}
}
class AirToSurfaceMissile implements MissileStrategy {
@Override
public void doAttack() {
// ๊ณต๋์ง ๋ฏธ์ฌ์ผ
}
}
class AirToAirMissile implements MissileStrategy {
@Override
public void doAttack() {
// ๊ณต๋๊ณต ๋ฏธ์ฌ์ผ
}
}
๋ค์์ผ๋ก ๋ฏธ์ฌ์ผ์ ์ฌ์ฉํ๋ ์ ๋์ ์ ์ํ๋ค. Unit ํด๋์ค๋ฅผ ์ ์ํ๊ณ ์ด๋ฅผ ์์ํ๋ ํญ๊ฒฉ๊ธฐ(Bomber)์ ์ ํฌ๊ธฐ(Fighter)๋ฅผ ์ ์ํ๋ค.
public class Unit {
private MissileStrategy strategy;
public void missileAttack() {
strategy.doAttack();
}
public void setMissileStrategy(MissileStrategy missileStrategy) {
this.strategy = missileStrategy;
}
}
class Bomber extends Unit {
// ํญ๊ฒฉ๊ธฐ
}
class Fighter extends Unit {
// ์ ํฌ๊ธฐ
}
๋ง์ง๋ง์ผ๋ก ์ ๋ต ํจํด์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
public class StrategyPatternTest {
public static void main(String[] args) {
Unit fighter = new Fighter();
Unit bomber = new Bomber();
// ์ ํฌ๊ธฐ์ ๋ฏธ์ฌ์ผ ์ ๋ต
fighter.setMissileStrategy(new AntiTankMissile());
// ํญ๊ฒฉ๊ธฐ์ ๋ฏธ์ฌ์ผ ์ ๋ต
bomber.setMissileStrategy(new AirToSurfaceMissile());
fighter.missileAttack();
bomber.missileAttack();
// ์ ํฌ๊ธฐ์ ๋ฏธ์ฌ์ผ ์ ๋ต์ ๋ณ๊ฒฝํ๋ค.
fighter.setMissileStrategy(new AirToAirMissile());
fighter.missileAttack();
}
}
์ ๋ต ํจํด์ ์ง์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด, ์ด ํจํด์ ์ฅ์ ์ ํ์
ํ๊ธฐ ์ฝ๋ค. ์๋ก์ด ๋ฏธ์ฌ์ผ ์ ๋ต์ด ์ถ๊ฐ๋์์ ๋, ๊ทธ๋ฌ๋๊น ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ๋ค๋ฉด
ํด๋ผ์ด์ธํธ ์ฝ๋๋ ์์ ํ ํ์ ์์ด ์๋ก์ด Strategy ํด๋์ค๋ง ์ ์ํ์ฌ ๊ธฐ์กด์ MissileStrategy ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ํ๋ฉด ๋๋ค.