์ ๋ตํจํด์ ์ด์ ์ ๋ค๋ฃฌ ํ ํ๋ฆฟ ๋ฉ์๋์ ๊ฑฐ์ ๋์ผํ ์๋ฃจ์ ์ ์ ๊ณตํ๋ค.
ํ ํ๋ฆฟ ๋ฉ์๋๋ ๋ณํ๋ ๋ถ๋ถ๊ณผ ๋ณํ์ง ์๋ ๋ถ๋ถ ํน์ ๋ถ๊ฐ๊ธฐ๋ฅ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ๋ผ์ด๋ด๊ธฐ ์ํ ๋์์ธ ํจํด์ด๋ค.
ํ
ํ๋ฆฟ ๋ฉ์๋๋ ์์์ ์ฌ์ฉํ๋ค๋ ํน์ง์ด ์๋ค. ๋ณํ์ง ์๋ ๋ถ๋ถ์ ๋ถ๋ชจ ํด๋์ค์ ๋๊ณ ์์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ด๋ค.
์ผ๋จ ์์์ ์ฌ์ฉํ๋ค๋ ์ ์์ ๊ทธ๋ฆฌ ์ ์ฐํ์ง ์์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค. ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ์ํฅ์ ๋ฐ์ ์๋ฐ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ถ๋ชจ ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์๋ง์ ๋ณ๊ฒฝ์ง์ ์ด ๋ฐ์ํ ์ ์๋ค.
์ ๋ตํจํด์ ์์์ด ์๋ ์ธํฐํ์ด์ค ๊ตฌํ์ ํตํด ํ ํ๋ฆฟ ๋ฉ์๋๋ณด๋ค ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์๋ค.
์ ๋ตํจํด์ ๋ณํ์ง ์๋(๋ถ๊ฐ๊ธฐ๋ฅ) ๋ถ๋ถ์ ๊ฐ๋ Context์์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ณํ๋ ๋ถ๋ถ(๋น์ฆ๋์ค ๋ก์ง)์ ํด๋นํ๋ ์ ๋ต(๊ตฌํ์ฒด)๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ๋ ํ์์ด๋ค.
๋จผ์ ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด์ Strategy ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
public interface Strategy {
void call();
}
์ด์ ์ด๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด 2๊ฐ๋ฅผ ๊ตฌํํ๋ค.
@Slf4j
public class StrategyLogic1 implements Strategy{
@Override
public void call() {
// ๋น์ฆ๋์ค ๋ก์ง ์คํ
log.info("logic1 processing ...");
}
}
=================================================
@Slf4j
public class StrategyLogic2 implements Strategy{
@Override
public void call() {
// ๋น์ฆ๋์ค ๋ก์ง ์คํ
log.info("logic2 processing ...");
}
}
๋ค์์ผ๋ก ๋ถ๊ฐ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ ๋ต์ ํธ์ถํ Context ํด๋์ค๋ฅผ ๊ตฌํํ๋ค.
@Slf4j
public class ContextV1 {
private final Strategy strategy;
public ContextV1(Strategy strategy) {
this.strategy = strategy;
}
public void execute() {
log.info("start");
long start = System.currentTimeMillis();
strategy.call();
long end = System.currentTimeMillis();
long spendTime = end - start;
log.info("end, time = {}", spendTime);
}
}
Context ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ ํ๋๋ก ๊ฐ๊ณ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
๋ฐ์ ์ฌ์ฉํ๊ณ ์๋ค.
์ธํฐํ์ด์ค์๋ง ์์กดํ๋ ๋ ์ถ์ํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฒ ๋์๋ค.
์ด๋ฐ ๊ตฌ์กฐ ๋๋ถ์ Context ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๋น์ฆ๋์ค ๋ก์ง์๋ ์ ํ ์ง์ฅ์ด ์๋ค.
๋ณ๊ฒฝ๋๋ ๋ถ๋ถ์ ํด๋นํ๋ Strategy์ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
๋ฐ์์ ํธ์ถํ๊ณ ์๋ค.
์คํ์๊ฐ์ ์ธก์ ํ๋ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋น์ฆ๋์ค ๋ก์ง์์ ๋ผ์ด๋ด๊ณ ์ ํ๋ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๊ณ ์์์ด ๊ฐ๋ ์ ์ฐํ์ง ์์ ๊ตฌ์กฐ๋ฅผ ์ธํฐํ์ด์ค๋ก ์ฐ์ฐํ๊ฒ ๋ง๋ค์๋ค.
@Slf4j
public class StrategyV1Test {
@Test
void test1 () {
ContextV1 context1 = new ContextV1(new StrategyLogic1());
context1.execute();
ContextV1 context2 = new ContextV1(new StrategyLogic2());
context2.execute();
}
}
์ธํ๋ฐ - ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ณ ๊ธํธ (๊น์ํ ๋)