spring core advanced : strategy pattern
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
package com.example.advanced.trace.strategy;
|
||||
|
||||
import com.example.advanced.trace.strategy.code.strategy.ContextV1;
|
||||
import com.example.advanced.trace.strategy.code.strategy.Strategy;
|
||||
import com.example.advanced.trace.strategy.code.strategy.StrategyLogic1;
|
||||
import com.example.advanced.trace.strategy.code.strategy.StrategyLogic2;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@Slf4j
|
||||
public class ContextV1Test {
|
||||
|
||||
@Test
|
||||
void strategyV0() {
|
||||
logic1();
|
||||
logic2();
|
||||
}
|
||||
|
||||
private void logic1() {
|
||||
long startTime = System.currentTimeMillis();
|
||||
// 비즈니스 로직 실행
|
||||
log.info("비즈니스 로직 실행1");
|
||||
long endTime = System.currentTimeMillis();
|
||||
long resultTime = endTime - startTime;
|
||||
log.info("resultTime={}", resultTime);
|
||||
}
|
||||
|
||||
private void logic2() {
|
||||
long startTime = System.currentTimeMillis();
|
||||
// 비즈니스 로직 실행
|
||||
log.info("비즈니스 로직 실행2");
|
||||
long endTime = System.currentTimeMillis();
|
||||
long resultTime = endTime - startTime;
|
||||
log.info("resultTime={}", resultTime);
|
||||
}
|
||||
|
||||
/**
|
||||
* 전략 패턴 사용
|
||||
*/
|
||||
@Test
|
||||
void strategyV1() {
|
||||
ContextV1 contextV1 = new ContextV1(new StrategyLogic1());
|
||||
contextV1.execute();
|
||||
|
||||
ContextV1 contextV2 = new ContextV1(new StrategyLogic2());
|
||||
contextV2.execute();
|
||||
}
|
||||
|
||||
@Test
|
||||
void strategyV2() {
|
||||
Strategy strategyLogic1 = new Strategy() {
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직1 실행");
|
||||
}
|
||||
};
|
||||
|
||||
ContextV1 contextV1 = new ContextV1(strategyLogic1);
|
||||
log.info("strategyLogic1={}", strategyLogic1.getClass());
|
||||
contextV1.execute();
|
||||
|
||||
Strategy strategyLogic2 = new Strategy() {
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직2 실행");
|
||||
}
|
||||
};
|
||||
|
||||
ContextV1 contextV2 = new ContextV1(strategyLogic2);
|
||||
log.info("strategyLogic2={}", strategyLogic2.getClass());
|
||||
contextV2.execute();
|
||||
}
|
||||
|
||||
@Test
|
||||
void strategyV3() {
|
||||
ContextV1 contextV1 = new ContextV1(new Strategy() {
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직1 실행");
|
||||
}
|
||||
});
|
||||
contextV1.execute();
|
||||
ContextV1 contextV2 = new ContextV1(new Strategy() {
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직2 실행");
|
||||
}
|
||||
});
|
||||
contextV2.execute();
|
||||
}
|
||||
|
||||
@Test
|
||||
void strategyV4() {
|
||||
ContextV1 contextV1 = new ContextV1(() -> log.info("비즈니스 로직1 실행"));
|
||||
contextV1.execute();
|
||||
ContextV1 contextV2 = new ContextV1(() -> log.info("비즈니스 로직2 실행"));
|
||||
contextV2.execute();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.example.advanced.trace.strategy;
|
||||
|
||||
import com.example.advanced.trace.strategy.code.strategy.ContextV2;
|
||||
import com.example.advanced.trace.strategy.code.strategy.Strategy;
|
||||
import com.example.advanced.trace.strategy.code.strategy.StrategyLogic1;
|
||||
import com.example.advanced.trace.strategy.code.strategy.StrategyLogic2;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import javax.naming.Context;
|
||||
|
||||
@Slf4j
|
||||
public class ContextV2Test {
|
||||
|
||||
/**
|
||||
* 전략 패턴 적용
|
||||
*/
|
||||
@Test
|
||||
void strategyV1() {
|
||||
ContextV2 context = new ContextV2();
|
||||
context.execute(new StrategyLogic1());
|
||||
context.execute(new StrategyLogic2());
|
||||
}
|
||||
|
||||
@Test
|
||||
void strategyV2() {
|
||||
ContextV2 context = new ContextV2();
|
||||
context.execute(new Strategy() {
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직1 실행");
|
||||
}
|
||||
});
|
||||
context.execute(new Strategy() {
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직2 실행");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void strategyV3() {
|
||||
ContextV2 context = new ContextV2();
|
||||
context.execute(() -> log.info("비즈니스 로직1 실행"));
|
||||
context.execute(() -> log.info("비즈니스 로직2 실행"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.example.advanced.trace.strategy.code.strategy;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* 필드에 전략을 보관하는 방식
|
||||
*/
|
||||
@Slf4j
|
||||
public class ContextV1 {
|
||||
|
||||
private final Strategy strategy;
|
||||
|
||||
public ContextV1(Strategy strategy) {
|
||||
this.strategy = strategy;
|
||||
}
|
||||
|
||||
public void execute() {
|
||||
long startTime = System.currentTimeMillis();
|
||||
// 비즈니스 로직 실행
|
||||
strategy.call();
|
||||
long endTime = System.currentTimeMillis();
|
||||
long resultTime = endTime - startTime;
|
||||
log.info("resultTime={}", resultTime);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.example.advanced.trace.strategy.code.strategy;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* 전략을 파라미터로 전달 받는 방식
|
||||
*/
|
||||
@Slf4j
|
||||
public class ContextV2 {
|
||||
|
||||
public void execute(Strategy strategy) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
// 비즈니스 로직 실행
|
||||
strategy.call();
|
||||
long endTime = System.currentTimeMillis();
|
||||
long resultTime = endTime - startTime;
|
||||
log.info("resultTime={}", resultTime);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package com.example.advanced.trace.strategy.code.strategy;
|
||||
|
||||
public interface Strategy {
|
||||
void call();
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.example.advanced.trace.strategy.code.strategy;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class StrategyLogic1 implements Strategy{
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직1 실행");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.example.advanced.trace.strategy.code.strategy;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class StrategyLogic2 implements Strategy{
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직2 실행");
|
||||
}
|
||||
}
|
||||
@@ -32,6 +32,7 @@ public class TemplateMethodTest {
|
||||
long resultTime = endTime - startTime;
|
||||
log.info("resultTime={}", resultTime);
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 메서드 패턴 적용
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user