728x90
반응형
전략 패턴 (Strategy Pattern)
전략 패턴(Strategy Pattern)은 행동(알고리즘)을 캡슐화하여 동적으로 변경하거나 선택할 수 있도록 도와주는 디자인 패턴입니다. 객체의 행동을 별도의 클래스로 분리하여 실행 중에 행동을 교체할 수 있게 합니다. 이 패턴은 개방-폐쇄 원칙(Open/Closed Principle)을 따르며, 코드를 확장하기 쉽게 설계할 수 있습니다.
전략 패턴의 구성 요소
- Context (문맥 클래스): 클라이언트가 사용하는 클래스이며, 특정 전략(알고리즘)을 사용하는 역할을 합니다. 전략 객체를 주입받아 사용하며, 주입된 전략에 따라 동작이 결정됩니다.
- Strategy (전략 인터페이스): 공통 인터페이스로, 다양한 전략들이 구현해야 할 메서드를 정의합니다. 여러 구현체들이 공통된 메서드 이름을 가지며, 각각 다른 방식으로 동작합니다.
- Concrete Strategy (구체적인 전략): 전략 인터페이스를 구현한 클래스들입니다. 각 클래스는 특정 알고리즘이나 행동을 구현합니다.
코드 예제: 전략 패턴 구현
1. 전략 인터페이스
// 인코딩 전략 인터페이스
interface EncodingStrategy {
String encode(String text);
}
2. 구체적인 전략
import java.util.Base64;
// Base64 인코딩 전략
class Base64Strategy implements EncodingStrategy {
@Override
public String encode(String text) {
return Base64.getEncoder().encodeToString(text.getBytes());
}
}
// 일반 텍스트 그대로 반환하는 전략
class NormalStrategy implements EncodingStrategy {
@Override
public String encode(String text) {
return text;
}
}
// 텍스트 앞에 "ABC"를 추가하는 전략
class AppendStrategy implements EncodingStrategy {
@Override
public String encode(String text) {
return "ABC" + text;
}
}
3. Context (문맥 클래스)
class Encoder {
private EncodingStrategy encodingStrategy;
// 전략 설정 메서드 (Setter 방식)
public void setEncodingStrategy(EncodingStrategy encodingStrategy) {
this.encodingStrategy = encodingStrategy;
}
// 전략을 실행하여 결과 반환
public String encode(String message) {
return encodingStrategy.encode(message);
}
}
4. 클라이언트 코드
public class StrategyTest {
public static void main(String[] args) {
EncodingStrategy base64 = new Base64Strategy();
EncodingStrategy normal = new NormalStrategy();
EncodingStrategy append = new AppendStrategy();
String message = "1234";
Encoder encoder = new Encoder();
encoder.setEncodingStrategy(base64);
String result = encoder.encode(message);
System.out.println("Base64: " + result);
encoder.setEncodingStrategy(normal);
result = encoder.encode(message);
System.out.println("Normal: " + result);
encoder.setEncodingStrategy(append);
result = encoder.encode(message);
System.out.println("Append: " + result);
}
}
실행 결과
Base64: MTIzNA==
Normal: 1234
Append: ABC1234
전략 패턴의 장점
- 행동의 캡슐화: 특정 행동(알고리즘)을 캡슐화하여 코드 변경 없이 새로운 전략을 쉽게 추가할 수 있습니다.
- 유연성: 런타임 시 전략을 변경할 수 있어 동적인 요구 사항에 대응할 수 있습니다.
- 확장성: 새로운 전략(구체적인 클래스)을 추가하더라도 기존 코드에 영향을 주지 않습니다.
- 코드 재사용성: 공통 인터페이스를 기반으로 다양한 전략을 구현하면 코드의 재사용성을 높일 수 있습니다.
전략 패턴을 사용하면 좋은 경우
- 행동이 자주 변경될 때: 특정 행동이나 알고리즘이 자주 변경되는 경우, 전략 패턴을 통해 변경 사항을 효과적으로 관리할 수 있습니다.
- 동적으로 행동을 선택해야 할 때: 실행 중에 행동을 변경하거나 선택해야 하는 경우.
- 조건문(분기문)이 많을 때:
if-else
나switch
문이 많은 코드를 전략 패턴으로 단순화할 수 있습니다.
전략 패턴의 단점
- 복잡성 증가: 전략 클래스가 많아질수록 코드 구조가 복잡해질 수 있습니다.
- 클래스 수 증가: 전략을 캡슐화하는 클래스가 늘어나기 때문에 관리가 어려워질 수 있습니다.
전략 패턴은 다양한 알고리즘과 행동을 캡슐화하여 동적으로 변경할 수 있는 유연한 구조를 제공합니다. 특히, 비즈니스 로직에서 행동이 자주 변경되거나 조건문이 많아지는 경우 전략 패턴을 적용하여 코드의 유지보수성과 가독성을 높일 수 있습니다.
728x90
반응형
'Java&Spring' 카테고리의 다른 글
[JAVA] SOLID 원칙 (0) | 2025.01.16 |
---|---|
[디자인패턴] 빌더 패턴( Builder Pattern) (0) | 2025.01.16 |
[bankApp05] 화면구현하기1 (템플릿 가져오기 ) (0) | 2025.01.15 |
댓글