개발자 피터
Peter's Dev Blog
개발자 피터
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 🧑🏻‍💻 Develop (13)
      • Devops (3)
      • Elasticsearch (3)
      • Design Pattern (1)
      • SQL (4)
      • Architecture (1)
      • APM (1)
    • 💻 Service (7)
      • E-ROOM (3)
      • Briefing (4)
    • 💡 Problem Solving (43)
      • Baekjoon (40)
      • Programmers (2)
    • 📚 Reading (12)
      • Tech (9)
      • Self-Help (3)
    • 💬 Etc (1)
    • 📈 Retrospective (1)

블로그 메뉴

  • 🌟 깃허브
  • 🏷️ 태그 클라우드
  • 📝 방명록

공지사항

인기 글

태그

  • 백트래킹
  • elasticsearch
  • 브루트포스
  • briefing
  • 구현
  • 독서
  • 백준
  • boj
  • E-ROOM
  • SQL
  • java
  • Programmers
  • MySQL
  • 문자열
  • 그리디

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자 피터

Peter's Dev Blog

[Design Pattern] Strategy 패턴
🧑🏻‍💻 Develop/Design Pattern

[Design Pattern] Strategy 패턴

2023. 12. 17. 23:55
728x90
반응형

💡 Strategy 패턴이란?

전략(Strategy) 패턴은 객체 지향 프로그래밍에서 널리 사용되는 디자인 패턴 중 하나입니다. 이 패턴의 핵심은 특정 태스크를 수행하는 알고리즘(전략)을 객체의 행동으로 캡슐화하고, 이를 동적으로 변경할 수 있게 하는 것입니다. 즉, 알고리즘의 변경이 사용자나 클라이언트 코드에 영향을 미치지 않으면서도 알고리즘을 유연하게 교체할 수 있습니다. 이는 '전략'을 정의하는 일련의 클래스들을 생성하고, 이 클래스들이 동일한 인터페이스나 추상 클래스를 구현하도록 함으로써 달성됩니다.

 

🌟 전략 패턴의 장점

  1. 확장성: 새로운 전략을 추가하기 위해 기존 코드를 변경할 필요가 없습니다.
  2. 재사용성: 다른 문맥에서도 같은 전략을 재사용할 수 있습니다.
  3. 유지보수 용이: 전략을 독립적으로 개발하고 테스트할 수 있어 유지보수가 용이합니다.
  4. 원칙 준수: 개방-폐쇄 원칙(Open-Closed Principle)과 단일 책임 원칙(Single Responsibility Principle)을 준수합니다.

개방-폐쇄 원칙 (Open-Closed Principle)

개방-폐쇄 원칙은 소프트웨어 개체(클래스, 모듈, 함수 등)가 확장에는 열려 있어야 하지만, 수정에는 닫혀 있어야 한다는 원칙입니다.

전략 패턴에서의 적용: 전략 패턴은 새로운 전략(즉, 새로운 알고리즘 또는 행동)을 추가할 때 기존의 코드(특히 Context 클래스)를 수정할 필요가 없습니다. 새로운 전략을 구현하기 위해 Strategy 인터페이스를 구현하는 새로운 클래스를 추가하기만 하면 됩니다. 따라서 시스템은 새로운 기능 확장에는 열려 있지만, 기존 코드의 변경 없이도 이를 수용할 수 있으므로 개방-폐쇄 원칙을 준수합니다.

단일 책임 원칙 (Single Responsibility Principle)

단일 책임 원칙은 클래스가 하나의 기능만을 가지고, 그 책임은 오직 하나의 클래스에만 속해야 한다는 원칙입니다.

전략 패턴에서의 적용: 전략 패턴에서 각 전략 클래스(ConcreteStrategy)는 하나의 알고리즘 또는 행동을 캡슐화합니다. 이는 각 전략 클래스가 하나의 책임만을 가지며, 그 책임은 전적으로 해당 클래스에 속한다는 것을 의미합니다. 또한, Context 클래스는 전략의 선택과 실행의 관리를 담당하지만, 실제 전략의 구현에 대해서는 알지 못합니다. 이렇게 책임이 분리되어 있기 때문에 단일 책임 원칙을 준수합니다.

 

📐 클래스 다이어그램

전략 패턴의 클래스 다이어그램은 다음과 같습니다.

전략패턴 클래스다이어그램

이 다이어그램은 전략 패턴의 구조를 보여주며, 각 클래스와 인터페이스의 관계를 명확하게 설명합니다.

  • Context: 전략(Strategy) 객체를 가지고 있는 클래스입니다. 전략을 설정하고 (setStrategy) 해당 전략을 실행(executeStrategy)하는 메서드를 포함합니다.
  • Strategy: 전략을 정의하는 인터페이스. 모든 구체적인 전략 클래스들(ConcreteStrategyA, ConcreteStrategyB, ConcreteStrategyC)은 이 인터페이스를 구현합니다.
  • ConcreteStrategyA, ConcreteStrategyB, ConcreteStrategyC: 구체적인 전략을 구현하는 클래스들입니다. 각각 다른 방식으로 algorithmInterface 메서드를 구현합니다.

 

🛠 사용 사례

전략 패턴은 다양한 상황에서 유용합니다. 예를 들어, 소프트웨어의 로그 기능에 대해 생각해보면, 로그를 콘솔, 파일, 또는 네트워크 등 다양한 방식으로 출력할 수 있습니다. 각각의 출력 방식은 별도의 '전략'으로 구현되며, 실행 중에 필요에 따라 교체될 수 있습니다.

전략패턴의 사례

  • LoggerContext 클래스:
    • 역할: 로그 메시지를 출력하는 주체입니다. 사용할 로그 전략을 결정하고, 로그 메시지를 전달합니다.
    • 특징:
      • LogStrategy strategy: 로그 전략을 저장하는 멤버 변수입니다.
      • setLogStrategy(LogStrategy strategy): 사용할 로그 전략을 설정하는 메서드입니다.
      • logMessage(String message): 로그 메시지를 기록하는 메서드입니다. 설정된 로그 전략에 따라 메시지를 출력합니다.
    • LoggerContext 클래스는 실행 중에 로그 전략을 쉽게 변경할 수 있어, 로그를 다양한 방식으로 유연하게 기록할 수 있습니다.
  • LogStrategy 인터페이스:
    • 역할: 모든 로그 전략 클래스가 구현해야 할 인터페이스입니다.
    • 특징:
      • log(String message): 로그 메시지를 기록하는 메서드입니다. 이 메서드는 구체적인 로그 전략에 따라 다르게 구현됩니다.
  • ConcreteStrategy 클래스들 (ConsoleLogStrategy, FileLogStrategy, NetworkLogStrategy):
    • 역할: LogStrategy 인터페이스의 구체적인 구현체들입니다. 각 클래스는 로그를 콘솔, 파일, 네트워크 등 특정 매체로 출력하는 전략을 구현합니다.
    • 특징:
      • log(String message): 실제 로그를 출력하는 구현 메서드입니다. 각 전략에 따라 다르게 구현됩니다.
       
728x90
반응형
저작자표시 (새창열림)
    개발자 피터
    개발자 피터
    Backend Engineer 🔥

    티스토리툴바