[Design Pattern] Strategy

2023. 11. 26. 14:11·Reference/Design Pattern
목차
  1. 1. Strategy Pattern
  2. 2. 예시 코드
📕 목차

1. Strategy Pattern
2. 예시 코드

1. Strategy Pattern

 

📌 전략 패턴

  • 정책 패턴(policy pattern)이라고도 한다.
  • 실행(런타임) 중에 객체의 행위를 바꾸는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주면서 상호 교체하는 패턴
  • 전략이란 일종의 알고리즘이며, 특정 목표를 수행하기 위한 기능이나 동작 계획을 말한다.
  • 어떤 일을 수행하는 알고리즘이 여러가지 일 때, 변형이 빈번하게 필요한 경우 적합하다.
    • 결제 방법은 네이버 페이, 카카오 페이 등 다양한 방법이 존재한다.
    • OAuth 인증 방법은 네이버, 카카오, 구글, 애플 등 다양한 방법이 존재한다.
  • 구조
    • 클라이언트: 특정 전략 객체를 Context에 전달하여, 전략을 등록하거나 전략 알고리즘 실행 결과를 받는다.
    • Context: 알고리즘을 실행해야 할 때마다, 해당 알고리즘과 연결된 전략 객체 메서드 호출
    • 전략 인터페이스: 모든 전략 구현체에 대한 공용 인터페이스
    • 전략 알고리즘 객체: 알고리즘, 행위, 동작을 객체로 정의한 구현체

 

📌 OOP의 집합체

  • 동일 계열의 알고리즘군을 정의하고 → 전략 구현체 정의
  • 각각의 알고리즘을 캡슐화하여 → 전략 인터페이스로 추상화
  • 이들을 상호교환이 가능하도록 만든다 → 컴포지션으로 구성
  • 알고리즘을 사용하는 클라이언트와 상관없이 독집적으로 → 컨텍스트 수정 없이
  • 알고리즘을 다양하게 변경할 수 있다 → 메서드를 통해 전략 객체를 실시간으로 변경

 

📌 코드 패턴

🟡 전략 인터페이스와 구현체

// 전략(추상화된 알고리즘)
interface Strategy {
    void doSomething();
}

// 전략 알고리즘 A
class ConcreteStrategyA implements Strategy {
    public void doSomething() {}
}

// 전략 알고리즘 B
class ConcreteStrategyB implements Strategy {
    public void doSomething() {}
}

 

🟡 컨텍스트

class Context {
    Strategy strategy;
	
    public Context(IStrategy strategy) {
        this.strategy = strategy;
    }
	
    // 전략 실행 메소드
    void doSomething() {
        strategy.doSomething();
    }
}

 

🟡 클라이언트

class Client {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStrategyA);
        
        context.doSomthing();
    }
}

 

📌 사용 시기
  • 전략 알고리즘이 여러 버전 또는 변형이 필요할 때 클래스화하여사용
  • 알고리즘 코드가 노출되어서는 안 되는 데이터에 접근하는 경우 (캡슐화)
  • 알고리즘 동작이 런타임에 실시간으로 교체되어야 할 때

 

📌 주의점
  • 알고리즘이 많아질 수록 관리해야 할 객체 수가 늘어난다.
  • 애플리케이션 특성 상 알고리즘이 많지 않고, 자주 변경되지 않는다면 굳이 분리해서 복잡도를 올릴 필요가 없다.
  • 개발자는 적절한 전략을 선택하기 위해 전략 간 차이점을 파악하고 있어야 한다.

 


2. 예시 코드

 

📌 결제 전략 인터페이스
public interface PaymentStrategy {
    void pay(int amount);
}

 

📌 전략 구현체

1️⃣ 카카오 카드 결제 전략

public class KAKAOCardStrategy implements PaymentStrategy {
    private String name;
    private String cardNumber;
    private String cvc;
    private String dateOfExpiry;

    public KAKAOCardStrategy(String name, String cardNumber, String cvc, String dateOfExpiry) {
        this.name = name;
        this.cardNumber = cardNumber;
        this.cvc = cvc;
        this.dateOfExpiry = dateOfExpiry;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + "원을 카카오 카드로 결제합니다.");
    }
}

 

2️⃣ 네이버 카드 결제 전략

public class NAVERCardStrategy implements PaymentStrategy {
    private String email;
    private String password;

    public NAVERCardStrategy(String email, String password) {
        this.email = email;
        this.password = password;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + "원을 네이버 카드로 결제합니다.");
    }
}

 

📌 Context
public class ShoppingCart {
    private List<Item> items = new ArrayList<>();

    public void addItem(Item item) {
        items.add(item);
    }

    public void removeItem(Item item) {
        items.remove(item);
    }

    public int calculateTotal() {
        int sum = 0;
        for (Item item : items) {
            sum += item.getPrice();
        }
        return sum;
    }

    public void pay(PaymentStrategy paymentMethod) {
        int amount = calculateTotal();
        paymentMethod.pay(amount);
    }
}

 

📌 Client
public class Client {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        Item item1 = new Item("컴퓨터", 1000000);
        Item item2 = new Item("키보드", 50000);

        cart.addItem(item1);
        cart.addItem(item2);

        // 카카오 카드로 결제
        cart.pay(new KAKAOCardStrategy("홍길동", "1234-1234-1234-1234", "123", "12/24"));

        // 네이버 카드로 결제
        cart.pay(new NAVERCardStrategy("a@a.com", "1234"));
    }
}

 

 

저작자표시 비영리 (새창열림)
  1. 1. Strategy Pattern
  2. 2. 예시 코드
'Reference/Design Pattern' 카테고리의 다른 글
  • [Design Pattern] Proxy
  • [Design Pattern] Observer
  • [Design Pattern] Factory
  • [Design Pattern] Singleton
나죽못고나강뿐
나죽못고나강뿐
싱클레어, 대부분의 사람들이 가는 길은 쉽고, 우리가 가는 길은 어려워요. 우리 함께 이 길을 가봅시다.
  • 나죽못고나강뿐
    코드를 찢다
    나죽못고나강뿐
  • 전체
    오늘
    어제
    • 분류 전체보기 (451) N
      • Computer Science (59)
        • Git & Github (4)
        • Network (17)
        • Computer Structure & OS (13)
        • Software Engineering (5)
        • Database (9)
        • Security (4)
        • Concept (7)
      • Frontend (21)
        • React (13)
        • Android (4)
        • iOS (4)
      • Backend (75) N
        • Spring Boot & JPA (48) N
        • Django REST Framework (14)
        • MySQL (8)
        • Nginx (1)
        • FastAPI (4)
      • DevOps (24)
        • Docker & Kubernetes (11)
        • Naver Cloud Platform (1)
        • AWS (2)
        • Linux (6)
        • Jenkins (0)
        • GoCD (3)
      • Coding Test (112)
        • Solution (104)
        • Algorithm (7)
        • Data structure (0)
      • Reference (134)
        • Effective-Java (90)
        • Pragmatic Programmer (0)
        • CleanCode (11)
        • Clean Architecture (2)
        • Test-Driven Development (4)
        • Relational Data Modeling No.. (0)
        • Microservice Architecture (2)
        • 알고리즘 문제 해결 전략 (9)
        • Modern Java in Action (0)
        • Spring in Action (0)
        • DDD start (0)
        • Design Pattern (6)
        • 대규모 시스템 설계 (6)
        • JVM 밑바닥까지 파헤치기 (4)
      • Service Planning (2)
      • Side Project (5)
      • AI (0)
      • MATLAB & Math Concept & Pro.. (1)
      • Review (15)
      • Interview (1)
      • IT News (2)
  • 블로그 메뉴

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

    • 깃
  • 공지사항

    • 취업 전 계획 재조정
    • 취업 전까지 공부 계획
    • 앞으로의 일정에 대하여..
    • 22년 동계 방학 기간 포스팅 일정
    • 중간고사 기간 이후 포스팅 계획 (10.27~)
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
나죽못고나강뿐
[Design Pattern] Strategy

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.