티스토리 뷰
728x90
반응형
전략 패턴이란?
- 변하지 않는 기능을 Context라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하도록하여 문제를 해결하는 방식입니다. 상속이 아닌 위임을 통하여 문제를 해결합니다.
클래스 다이어그램
전략 패턴 구조
상황 설명
- 교수와 학생은 휴대폰의 잠금을 해지하는 경우 교수는 안면 인식을 통하여 잠금을 해제하고 학생은 비밀번호를 입력하여 잠금을 해제합니다. 여기서 잠금을 해제하는 행위는 변하지 않는 행위이며 휴대폰의 잠금을 해지하기 위한 과정의 행위는 변하는 행위입니다.
- 안면인식과 비밀번호 입력은 사용자마다 변하는 행위이므로 Straegy에 비유할 수 있고 잠금 해제하는 행위는 변하지 않는 행위이므로 Context에 비유할 수 있습니다.
전략 패턴을 적용하지 않은 예제
- 아래 예제를 보면 Teacher 클래스와 Student 클래스에서 휴대폰의 화면을 키는 행위는 동일하고 암호를 해지하는 방법에서의 행위만 달라집니다.
public class Teacher {
public void passwordRelease() {
System.out.println("휴대폰의 화면을 킵니다.");
System.out.println("안면 인식 방법으로 암호를 해지합니다.");
}
}
public class Student {
public void passwordRelease() {
System.out.println("휴대폰의 화면을 킵니다.");
System.out.println("비밀번호 방법으로 암호를 해지합니다.");
}
}
public class Example {
@Test
void test(){
Teacher teacher = new Teacher();
teacher.passwordRelease();
Student student = new Student();
student.passwordRelease();
}
}
Example 실행 결과
전략 패턴을 적용한 예제 - 01
- 아래 예제는 변하는 행위를 하는 메서드를 Strategy 인터페이스에 선언한 뒤 해당 메서드를 각 클래스마다 구현을 하도록하여 다형성을 부여합니다.
- 화면을 키는 행위는 변하지 않는 행위이므로 Human이라는 클래스를 만들어 공통화를 합니다.
- Human 클래스는 Context에 해당합니다.
public interface Strategy {
void passwordRelease();
}
public class Teacher implements Strategy{
@Override
public void passwordRelease() {
System.out.println("안면 인식 방법으로 암호를 해지합니다.");
}
}
public class Student implements Strategy{
@Override
public void passwordRelease() {
System.out.println("비밀번호 방법으로 암호를 해지합니다.");
}
}
public class Human {
private Strategy strategy;
public Human(Strategy strategy) {
this.strategy = strategy;
}
public void execute(){
System.out.println("휴대폰의 화면을 킵니다.");
strategy.passwordRelease();
}
}
public class Example {
@Test
void test(){
Strategy teacherMethod = new Teacher();
Strategy studentMethod = new Student();
Human teacher = new Human(teacherMethod);
Human student = new Human(studentMethod);
teacher.execute();
student.execute();
}
}
Example 실행 결과
전략 패턴을 적용한 예제 - 02
- 위의 예제와 동일하지만 위의 예제는 멤버 변수에 생성자 주입을 통하여 진행을 했지만 해당 예제는 전략을 실행할 때 파라미터로 전달하여 사용하는 예제입니다.
- Human 클래스와 실행 예제만 달라집니다.
- Human 클래스의 execute() 메서드에서 Strategy 인터페이스를 구현하는 구현체를 파라미터로 받아서 Context를 실행하는 시점에서 원하는 Strategy를 전달할 수 있습니다.
- 이전방식과 비교해본다면 생성시점에서 받는것보다 실행시점에서 받는것이 조금 더 유연성이 있는것 같습니다.
public class Human {
public void execute(Strategy strategy){
System.out.println("휴대폰의 화면을 킵니다.");
strategy.passwordRelease();
}
}
public class Example {
@Test
void test(){
Human human = new Human();
human.execute(new Teacher());
human.execute(new Student());
}
}
Example 실행 결과
728x90
반응형
'JAVA > Design_Pattern' 카테고리의 다른 글
[Design_Pattern] 프로토 타입 패턴 (0) | 2022.02.28 |
---|---|
[Design_Pattern] 빌더 패턴 (0) | 2022.02.21 |
[Design_Pattern] 템플릿 메서드 패턴 (0) | 2022.02.16 |
[Design_Pattern] 템플릿 콜백 패턴(Template Callback Pattern) (0) | 2021.06.30 |
[Design_Pattern] 싱글톤패턴 방식의 주의점 (0) | 2021.04.05 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- service based architecture
- 트랜잭셔널 아웃박스 패턴 스프링부트
- pipe and filter architecture
- spring boot 엑셀 다운로드
- spring boot redis 대기열 구현
- spring boot redisson 분산락 구현
- 레이어드 아키텍처란
- spring boot poi excel download
- 람다 표현식
- transactional outbox pattern
- pipeline architecture
- redis 대기열 구현
- java ThreadLocal
- @ControllerAdvice
- polling publisher spring boot
- java userThread와 DaemonThread
- 공간 기반 아키텍처
- 자바 백엔드 개발자 추천 도서
- redis sorted set
- space based architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- spring boot redisson sorted set
- spring boot excel download oom
- transactional outbox pattern spring boot
- spring boot redisson destributed lock
- spring boot excel download paging
- redis sorted set으로 대기열 구현
- microkernel architecture
- 서비스 기반 아키텍처
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함