728x90
비슷한 동작을 하지만 다르게 구현되어 있는 행위(전략)들을 공통의 인터페이스를 구현하는 각각의 클래스로 구현하고, 동적으로 바꿀 수 있도록 하는 패턴이다. 동일 계열의 알고리즘군을 정의하고 각각의 알고리즘을 캡슐화하여 이들을 상호 교환이 가능하도록 만든다.
장점
- 클라이언트는 인터페이스를 통해 알고리즘을 사용하므로, 실행 중에 다른 알고리즘으로 교체하는 것이 쉬워 애플리케이션의 유연성과 확장성이 증가
- 각각의 알고리즘을 독립적인 클래스로 구현하기 때문에, 코드를 재사용이 용이
- 전략 클래스를 인터페이스를 통해 분리하여 개별적으로 테스트 가능
- 알고리즘을 사용하는 클라이언트와 상관 없이 독립적으로 알고리즘 변경이 가능
단점
- 각각의 알고리즘을 독립적인 클래스로 구현해야 하므로, 전략의 개수가 많을 경우 클래스의 수가 증가할 수 있음
- 전략 패턴을 사용하면 컨텍스트와 전략이 느슨하게 결합되긴 하지만, 여전히 컨텍스트는 전략을 명시적으로 선택해야 함
예시
- 전략 패턴을 사용하여 로그인 전략을 세워본다.
- 간단 로그인 : 패스워드 없이 usrName으로만 로그인
- 일반 로그인 : 패스워드가 필요한 로그인
- 예시 코드는 로그인 로직은 생략하고 전략 패턴에 집중한다.
interface LoginStrategy {
void login(String usrName, String password);
}
public class PasswordLogin implements LoginStrategy{
private String usrName;
private String password;
@Override
public void login(String usrName, String password){
//usrName과 password를 사용한 로그인 로직 구현
System.out.println("password login");
};
}
public class SimpleLogin implements LoginStrategy {
private String usrName;
@Override
public void login(String usrName, String password){
//usrName만 사용한 로그인 로직 구현
System.out.println("simple login");
};
}
public class LoginManagement {
private LoginStrategy loginStrategy;
public LoginManagement(LoginStrategy loginStrategy){
this.loginStrategy = loginStrategy;
}
public void doLogin(String usrName, String password){
loginStrategy.login(usrName, password);
}
}
public class Main {
public static void main(String[] args) {
LoginStrategy passwordLogin = new PasswordLogin();
LoginStrategy simpleLogin = new SimpleLogin();
LoginManagement loginManager = new LoginManagement(passwordLogin);
loginManager.doLogin("user1", "password!@!");
loginManager = new LoginManagement(simpleLogin);
loginManager.doLogin("user2", "");
}
}
참고
https://inpa.tistory.com/entry/GOF-💠-전략Strategy-패턴-제대로-배워보자#
728x90
'💻dev > 🖥️CS' 카테고리의 다른 글
SQL | 데이터베이스에서의 NULL 값 관리: COALESCE 함수 사용하기 (0) | 2023.09.22 |
---|---|
CS | 최근에 기억에 남는 기술 면접 질문 - 답변 모음 (개발자 취준) (2) | 2023.09.22 |
CS | CPU 스케줄러와 스케줄링 알고리즘 (0) | 2023.08.12 |
CS | Design Pattern (디자인패턴) (0) | 2023.08.12 |
CS | Operating System (운영체제) (0) | 2023.08.12 |