[디자인패턴] - 전략 패턴(Strategy Pattern)

2025. 1. 16. 10:44·디자인 패턴

전략 패턴(Strategy Pattern) -

전략 패턴(Strategy Pattern)은 동작 방식을 캡슐화하여, 동적으로 전략을 변경할 수 있도록 하는 디자인 패턴중  행위 패턴(Behavioral Pattern) 입니다.

특정 기능을 수행할 여러 방법이 있을 때, 그 방법들을 전략(클래스)으로 정의하고, 필요에 따라 적절한 전략을 선택하여 사용할 수 있습니다.

알고리즘을 갭슐화 하여 런타임중 알고리즘을 선택하거나 교체 할 수 있도록 설계하는 패턴입니다.

특징

  1. 행동 캡슐화
    여러 알고리즘이나 동작을 각각의 클래스로 캡슐화하여, 객체가 동적으로 행동을 변경할 수 있도록 합니다.
  2. 상속 대신 구성
    클래스의 동작을 변경하기 위해 상속을 사용하는 대신, 별도의 전략 객체를 구성(Composition)하여 행동을 위임합니다.
  3. 확장성 제공
    새로운 알고리즘을 추가하더라도 기존 코드를 변경하지 않고 확장할 수 있습니다(Open-Closed Principle).

구성 요소

  1. Strategy (전략 인터페이스)
    • 공통된 알고리즘을 정의하는 인터페이스 또는 추상 클래스입니다.
    • 특정 알고리즘을 표현하는 메서드를 선언합니다.
  2. ConcreteStrategy (구체적인 전략)
    • Strategy 인터페이스를 구현하며, 실제 알고리즘을 정의합니다.
  3. Context (문맥)
    • Strategy 객체를 참조하며, 특정 알고리즘을 실행합니다.
    • 클라이언트는 Context를 통해 알고리즘을 호출하며, 알고리즘의 내부 구현은 알 필요가 없습니다.
package ch02;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

import javax.management.RuntimeErrorException;

public class StrategyTest {

	public static void main(String[] args) {
		
		// 추상화를 높이는게 좋은 코드가 될 수 있다.  
		EncodingStrategy base64 = new Base64Strategy();
		EncodingStrategy normal = new NormalStrategy();
		EncodingStrategy append = new AppendStrategy();
		EncodingStrategy urlencoding = new UrlEncodingStrategy();
		
		String message = "1 2 34 _ ";
		Encoder encoder = new Encoder();
		// Base64 인코딩해주세요 
		
		encoder.setEncodingStrategy(base64);
		System.out.println(encoder.getMessage(message));
		// 일반 텍스로 인코딩 해주세요 
		
		encoder.setEncodingStrategy(normal);
		System.out.println(encoder.getMessage(message));
		
		// append 텍스로 인코딩 해주세요 
		encoder.setEncodingStrategy(append);
		System.out.println(encoder.getMessage(message));
		
		// 도전 과제 - 
		// UrlEncodingStrategy 클래스를 만들고 전략 패턴을 활용해주세요 
		encoder.setEncodingStrategy(urlencoding);
		System.out.println(encoder.getMessage(message));
	}

} // end of class 
// 인코딩 전략 
interface EncodingStrategy {
	String encode(String text);
}
// 바이트 0101010 --> new File();
// 서버측 데이터를 API --- json --> 문자열 
// 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;
	}	
}

class UrlEncodingStrategy implements EncodingStrategy {
	
	@Override
	public String encode(String text) {
		try {
			//  URLEncoder 사용해서 UTF-8 형식으로 인코딩 
			// 공백, 특수문자 등을 % 형식을 변환해서 전송할 수 있도록 한다. 
			return URLEncoder
					.encode(text, StandardCharsets.UTF_8.toString());
		} catch (Exception e) {
			throw new RuntimeException("인코딩 실패", e);
		}
	}
}


// 클라이언트 클래스 
class Encoder {
	
	// DI - 생성자 주입 
	// DI - 메서드 주입 setter
	
	// 행동을 할 멤버
	EncodingStrategy encodingStrategy;
	
	// 전략에 따라서 실행할 메서드가 
	public String getMessage(String message) {
		return this.encodingStrategy.encode(message);
	}
	
	// 전략에 따라서 멤버 변경할 수 있는 메서드 필요 
	public void setEncodingStrategy(EncodingStrategy encodingStrategy) {
		this.encodingStrategy = encodingStrategy;
	}
	
}

전략 패턴의 장점

  1. 유연성
    • 런타임에 알고리즘을 변경할 수 있습니다.
    • 행동을 캡슐화하여 코드 재사용성을 높입니다.
  2. 단일 책임 원칙(SRP) 준수
    • 서로 다른 알고리즘을 별도의 클래스로 분리하여 관리합니다.
  3. Open-Closed Principle 준수
    • 기존 코드를 수정하지 않고 새로운 알고리즘을 쉽게 추가할 수 있습니다.

단점

  1. 클래스 수 증가
    • 알고리즘마다 별도의 클래스를 생성해야 하므로 코드가 복잡해질 수 있습니다.
  2. 클라이언트가 전략을 선택해야 함
    • 클라이언트가 적절한 전략을 선택해야 하므로 전략 패턴 사용이 복잡할 수 있습니다.

 

사용 사례

  • 다양한 알고리즘을 사용하는 상황에서, 런타임에 알고리즘을 동적으로 변경해야 하는 경우.
  • 여러 클래스가 비슷한 동작을 수행하지만, 내부 구현이 다른 경우.
  • 조건문 또는 분기문이 많아지는 코드에서 이를 대체할 때.

'디자인 패턴' 카테고리의 다른 글

[디자인패턴] MVVM 패턴  (0) 2025.01.23
[디자인패턴] 디자인 패턴 설명  (1) 2025.01.16
[디자인패턴] - 빌더 패턴(Builder Pattern)  (0) 2025.01.16
'디자인 패턴' 카테고리의 다른 글
  • [디자인패턴] MVVM 패턴
  • [디자인패턴] 디자인 패턴 설명
  • [디자인패턴] - 빌더 패턴(Builder Pattern)
noily4748
noily4748
백엔드 개발을 공부하고 있는 개발자 입니다!
  • noily4748
    noily4748 님의 블로그
    noily4748
  • 전체
    오늘
    어제
    • 분류 전체보기 (37)
      • 웹 (2)
      • Flutter (11)
      • Dart (5)
      • 디자인 패턴 (4)
      • 디스코드 (2)
      • [Flutter] 눈길 팀 프로젝트 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
noily4748
[디자인패턴] - 전략 패턴(Strategy Pattern)
상단으로

티스토리툴바