전략(Strategy) 패턴: 행위패턴
객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 패턴
필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부로 분리시켜, 전략 클래스를 만들어(캡슐화), 이를 필요에 따라 동적으로 바꿔서 사용할 수 있게 하는 디자인 패턴이다.
여기서 알고리즘이 뜻하는 바는 독립적인 책임으로 분리가 가능한 기능을 말한다. 이를 대체 가능한 전략이라고 보기 때문에 패턴 이름이 전략패턴이다.
전략패턴은 디자인의 꽃이라 불릴만큼 중요한 패턴이다.
Context: Strategy의 메소드를 호출해서 사용하는 클래스
Strategy: 전략을 사용하기 위한 공통 인터페이스
ConcreteStrategyA, B : Strategy 인터페이스를 실제 구현하는 클래스
Context가 어떤 전략을 사용하게 할 것인가를 앞단의 Client가 결정한다. Client가 구체적인 전략의 하나를 선택하고 오브젝트를 만들어서 Context에 전달한다. Context는 전달받은 그 Strategy 구현 클래스의 오브젝트를 사용한다.
전략 패턴의 장단점
장점
- 런타임에 한 객체 내부에서 사용되는 알고리즘을 교환할 수 있다.
- OCP원칙을 지키며, 새로운 전략을 도입할 수 있다.
단점
- 구현된 전략 클래스가 많아질 수록 복잡해진다.(여느 디자인 패턴이 그렇듯)
- 클라이언트가 구체적인 전략을 알아야 한다.
전략패턴과 커맨드패턴
전략패턴은 ‘어떻게’ 라는 측면에 초점을 둔다. 하고자 하는 것은 이미 정해져 있고, 방법을 어떻게 할지에 대한 유연성을 고려한다.
커맨드 패턴은 ‘무엇을’에 초점을 둔다. 어떻게 할지에 대한 방법은 외부에서 주입하며, 그것을 실행하는 것이 중요하기 때문이다.
전략 패턴의 예시
Context
public class Context {
LoginStrategy loginStrategy;
public Context(LoginStrategy loginStrategy) {
this.loginStrategy = loginStrategy;
}
public void login(){
loginStrategy.login();
}
}
LoginStrategy(Strategy Interface)
public interface LoginStrategy {
public void login();
}
NaverLoginStrategy(Concrete Strategy)
public class NaverLoginStrategy implements LoginStrategy{
@Override
public void login() {
System.out.println("네이버로 로그인");
}
}
KakaoLoginStrategy(Concrete Strategy)
public class KakaoLoginStrategy implements LoginStrategy{
@Override
public void login() {
System.out.println("카카오로 로그인");
}
}
Client
public class StrategyClient {
public static void main(String[] args) {
Context user = new Context(new KakaoLoginStrategy());
user.login();
user = new Context(new NaverLoginStrategy());
user.login();
Context user2 = new Context(new NaverLoginStrategy());
user2.login();
}
}
//출력
카카오로 로그인
네이버로 로그인
네이버로 로그인
'OOP > Design Pattern' 카테고리의 다른 글
19. 스테이트(State) 패턴 (0) | 2023.03.01 |
---|---|
18. 옵저버(Observer) 패턴 (0) | 2023.02.25 |
17. 메멘토(Memento) 패턴 (0) | 2023.02.25 |
16. 중재자(Mediator) 패턴 (0) | 2023.02.21 |
15. 이터레이터(iterator) 패턴 (0) | 2023.02.21 |