๐ฅ TIL - Day 79 ๋์์ธ ํจํด - ์ ๋ต ํจํด Strategy Pattern
์ ๋ตํจํด์ ์ด์ ์ ๋ค๋ฃฌ ํ ํ๋ฆฟ ๋ฉ์๋์ ๊ฑฐ์ ๋์ผํ ์๋ฃจ์ ์ ์ ๊ณตํ๋ค.
ํ ํ๋ฆฟ ๋ฉ์๋๋ ๋ณํ๋ ๋ถ๋ถ๊ณผ ๋ณํ์ง ์๋ ๋ถ๋ถ ํน์ ๋ถ๊ฐ๊ธฐ๋ฅ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ๋ผ์ด๋ด๊ธฐ ์ํ ๋์์ธ ํจํด์ด๋ค.
ํ
ํ๋ฆฟ ๋ฉ์๋๋ ์์์ ์ฌ์ฉํ๋ค๋ ํน์ง์ด ์๋ค. ๋ณํ์ง ์๋ ๋ถ๋ถ์ ๋ถ๋ชจ ํด๋์ค์ ๋๊ณ ์์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ด๋ค.
์ผ๋จ ์์์ ์ฌ์ฉํ๋ค๋ ์ ์์ ๊ทธ๋ฆฌ ์ ์ฐํ์ง ์์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค. ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ์ํฅ์ ๋ฐ์ ์๋ฐ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ถ๋ชจ ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์๋ง์ ๋ณ๊ฒฝ์ง์ ์ด ๋ฐ์ํ ์ ์๋ค.
์ ๋ตํจํด์ ์์์ด ์๋ ์ธํฐํ์ด์ค ๊ตฌํ์ ํตํด ํ ํ๋ฆฟ ๋ฉ์๋๋ณด๋ค ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์๋ค.
๐ ์ ๋ตํจํด ๊ตฌํ
์ ๋ตํจํด์ ๋ณํ์ง ์๋(๋ถ๊ฐ๊ธฐ๋ฅ) ๋ถ๋ถ์ ๊ฐ๋ 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();
}
}
๐ ์ฐธ๊ณ
์ธํ๋ฐ - ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ณ ๊ธํธ (๊น์ํ ๋)
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ฅ TIL - Day 79 ๋์์ธ ํจํด - ์ ๋ต ํจํด Strategy Pattern), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@dhk22/TIL-Day-๋์์ธ-ํจํด-์ ๋ต-ํจํด-Strategy-Pattern์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค