일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- 자바 1676
- Java Call By Refernce
- nodejs rabbitmq
- go
- spring mongoTemplate
- kotiln const
- kotiln functional interface
- 전략 패턴이란
- spring mongodb
- 안정해시
- 백준 특정한 최단 경로
- spring mongodb switch
- java 팩토리얼 개수
- ipfs bean
- javav 1676
- spring mongoTemplate switch
- 익명 객체 @transactional
- 백준 2252 줄세우기
- rabbitmq 싱글톤
- java 백준 1509
- java 1238
- ipfs singletone
- java 파티
- 자바 백준 팩토리얼 개수
- 백준 1504 java
- kotiln const val
- 백준 연결요소 자바
- mongodb lookup
- Spring ipfs
- java 1509
Archives
- Today
- Total
공부 흔적남기기
전략 패턴이란 본문
728x90
반응형
전략 패턴이란
컨텍스트(변하지 않는 부분) 안에서 전략(변하는 부분)을 전달받아 실행하는 패턴이다. 전략은 컨텍스트에서 인터페이스로 존재하며 여러 전략들이 인터페이스를 구현하여 컨텍스트에 주입되어 사용하게된다. 스프링에서 자주사용하는 DI도 전략패턴의 예라고 할 수 있다.
전략 패턴은 추상 클래스를 사용하는 템플릿 메소드 패턴와 달리 인터페이스를 사용하기 때문에 OCP 원칙에 좀 더 알맞고 부모클래스와의 의존관계가 없기 때문에 느슨한 결합을 추구할 수 있다.
언제사용할까?
변하는 로직과 변하지 않는 부분이 로직이 존재하고, 변하지 않는 로직에서 변하는 로직을 여러개로 갈아 끼울때, 예를들어 게시판을 만드는 서비스에서 mysql도 사용하고 싶고 mongodb도 사용하고 싶다면 board라는 컨텍스트가 있을 것이고 db라는 strategy interface를 만들고 mysql과 mogodb 전략을 갈아끼우며 사용할 수 있을 것이다.
컨텍스트에서 전략을 어떻게 주입할 수 있을까
- 생성자로 주입 받을 수 있다. ( 동적으로 전략을 바꾸는 것이 힘듦 -> setter을 통해 바꿀 수 있으나 동서성 이슈 차라리 여러가지 컨텍스트를 만드는 것이 차라리 나음)
- 파라미터로 주입받아 사용하기.
생성자로 주입하기
@Test
void strategyV1(){
StrategyLogic1 strategyLogic1 = new StrategyLogic1();
ContextV1 context1 = new ContextV1(strategyLogic1);
context1.execute();
StrategyLogic2 strategyLogic2 = new StrategyLogic2();
ContextV1 context2 = new ContextV1(strategyLogic2);
context2.execute();
}
@Test
void strategyV2(){
ContextV1 context1 = new ContextV1(() -> log.info("비즈니스 로직1 실행"));
context1.execute();
ContextV1 context2 = new ContextV1(() -> log.info("비즈니스 로직2 실행"));
context2.execute();
}
파라미터로 주입하기
@Test
void strategyV1(){
ContextV2 context1 = new ContextV2();
context1.execute(new StrategyLogic1());
context1.execute(new StrategyLogic2());
}
@Test
void strategyV2(){
ContextV2 context1 = new ContextV2();
context1.execute(() -> log.info("비즈니스 로직 1 실행"));
context1.execute(() -> log.info("비즈니스 로직 2 실행"));
}
참고로 strategyV2()와 같이 전략패턴을 사용하면서 람다로 콜백함수를 넘겨주는 방식을 템플릿 콜백 패턴이라고 한다( redisTempalte, jdbcTemplate, redistTemplate) 등에서 나오는 그 template과 일치하다.
728x90
반응형
'web study > 배경지식' 카테고리의 다른 글
jdk dynamic proxy | cglib (0) | 2023.12.19 |
---|---|
프록시 패턴 | 데코레이터 패턴 (0) | 2023.12.18 |
템플릿 메서드 패턴이란 (0) | 2023.05.22 |
Sentry 적용시 기본 설정 (0) | 2023.04.14 |
비대칭키 예시 (https 통신, Blockchain 예시) (0) | 2023.04.03 |