๐Ÿ”ฅ TIL - Day 79 ๋””์ž์ธ ํŒจํ„ด - ์ „๋žต ํŒจํ„ด Strategy Pattern

Kim Dae Hyunยท2022๋…„ 1์›” 4์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
90/93

์ „๋žตํŒจํ„ด์€ ์ด์ „์— ๋‹ค๋ฃฌ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋Š” ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ํ˜น์€ ๋ถ€๊ฐ€๊ธฐ๋Šฅ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋–ผ์–ด๋‚ด๊ธฐ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋Š” ์ƒ์†์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ๋‘๊ณ  ์ž์‹ ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
์ผ๋‹จ ์ƒ์†์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ทธ๋ฆฌ ์œ ์—ฐํ•˜์ง€ ์•Š์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ์ˆ˜๋งŽ์€ ๋ณ€๊ฒฝ์ง€์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „๋žตํŒจํ„ด์€ ์ƒ์†์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ํ†ตํ•ด ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“Œ ์ „๋žตํŒจํ„ด ๊ตฌํ˜„

์ „๋žตํŒจํ„ด์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”(๋ถ€๊ฐ€๊ธฐ๋Šฅ) ๋ถ€๋ถ„์„ ๊ฐ–๋Š” 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();

    }
}


๐Ÿ“Œ ์ฐธ๊ณ 

์ธํ”„๋Ÿฐ - ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ ๊ณ ๊ธ‰ํŽธ (๊น€์˜ํ•œ ๋‹˜)

profile
์ข€ ๋” ์ฒœ์ฒœํžˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง

0๊ฐœ์˜ ๋Œ“๊ธ€