3. 전략 패턴

2024. 12. 8. 22:08·CS/디자인 패턴
전략 패턴(strategy pattern)이란?
전략 패턴은 정책 패턴(policy pattern)이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 '직접' 수정하지 않고 전략이라고 부르는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다.

우리가 어떤 것을 살 때 네이버페이, 카카오페이 등 다양한 방법으로 결제하듯이 어떤 아이템을 살 때 LUNACard로 사는 것과 KAKAOCard로 사는 것을 구현한 예제이다.

결제 방식의 '전략'만 바꿔서 두 가지 방식으로 결제하는 것을 구현했다.

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
interface PaymentStrategy { 
    public void pay(int amount);
} 

class KAKAOCardStrategy implements PaymentStrategy {
    private String name;
    private String cardNumber;
    private String cvv;
    private String dateOfExpiry;
    
    public KAKAOCardStrategy(String nm, String ccNum, String cvv, String expiryDate){
        this.name=nm;
        this.cardNumber=ccNum;
        this.cvv=cvv;
        this.dateOfExpiry=expiryDate;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount +" paid using KAKAOCard.");
    }
} 

class LUNACardStrategy implements PaymentStrategy {
    private String emailId;
    private String password;
    
    public LUNACardStrategy(String email, String pwd){
        this.emailId=email;
        this.password=pwd;
    }
    
    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid using LUNACard.");
    }
} 

class Item { 
    private String name;
    private int price; 
    public Item(String name, int cost){
        this.name=name;
        this.price=cost;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }
} 

class ShoppingCart { 
    List<Item> items;
    
    public ShoppingCart(){
        this.items=new ArrayList<Item>();
    }
    
    public void addItem(Item item){
        this.items.add(item);
    }
    
    public void removeItem(Item item){
        this.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);
    }
}  

public class HelloWorld{
    public static void main(String []args){
        ShoppingCart cart = new ShoppingCart();
        
        Item A = new Item("kundolA",100);
        Item B = new Item("kundolB",300);
        
        cart.addItem(A);
        cart.addItem(B);
        
        // pay by LUNACard
        cart.pay(new LUNACardStrategy("kundol@example.com", "pukubababo"));
        // pay by KAKAOBank
        cart.pay(new KAKAOCardStrategy("Ju hongchul", "123456789", "123", "12/01"));
    }
}
/*
400 paid using LUNACard.
400 paid using KAKAOCard.
*/
더보기

컨텍스트

프로그래밍에서의 컨텍스트는 상황, 맥락, 문맥을 의미하며 개발자가 어떠한 작업을 완료하는 데 필요한 모든 관련 정보를 말한다.


passport의 전략 패턴

전략 패턴을 활용한 라이브러리로는 passport가 있다.

passport는 Node.js에서 인증 모듈을 구현할 때 쓰는 미들웨어 라이브러리로, 여러 가지 '전략'을 기반으로 인증할 수 있게 한다.

서비스 내의 회원가입된 아이디와 비밀번호를 기반으로 인증하는 LocalStrategy 전략과 페이스북, 네이버 등 다른 서비스를 기반으로 인증하는 OAuth 전략 등을 지원한다.

다음 코드처럼 '전략'만 바꿔서 인증하는 것을 볼 수 있다.

var passport = require('passport')
    , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
    function(username, password, done) {
        User.findOne({ username: username }, function (err, user) {
          if (err) { return done(err); }
            if (!user) {
                return done(null, false, { message: 'Incorrect username.' });
            }
            if (!user.validPassword(password)) {
                return done(null, false, { message: 'Incorrect password.' });
            }
            return done(null, user);
        });
    }
));

passport.use(new LocalStrategy( ... 처럼 passport.use()라는 메서드에 '전략'을 매개 변수로 넣어서 로직을 수행하는 것을 볼 수 있다.

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

5. 프록시 패턴과 프록시 서버  (0) 2024.12.08
4. 옵저버 패턴  (0) 2024.12.08
2. 팩토리 패턴  (0) 2024.12.08
1. 싱글톤 패턴  (0) 2024.12.08
0. 디자인 패턴  (1) 2024.12.08
'CS/디자인 패턴' 카테고리의 다른 글
  • 5. 프록시 패턴과 프록시 서버
  • 4. 옵저버 패턴
  • 2. 팩토리 패턴
  • 1. 싱글톤 패턴
seong-morning
seong-morning
seong-morning 님의 블로그 입니다.
  • seong-morning
    MilleZoo
    seong-morning
  • 전체
    오늘
    어제
    • 분류 전체보기 (87)
      • 백엔드 (17)
        • NestJS (17)
      • 인프라 (2)
        • Docker & Kubernetes (2)
      • CS (25)
        • 디자인 패턴 (9)
        • 프로그래밍 패러다임 (4)
        • 네트워크의 기초 (6)
        • TCP IP 4계층 모델 (2)
        • 네트워크 기기 (4)
      • 정보처리기사 (43)
        • [1과목] 1. 소프트웨어 설계 (10)
        • [1과목] 2. 화면 설계 (5)
        • [1과목] 3. 애플리케이션 설계 (8)
        • [1과목] 4. 인터페이스 설계 (4)
        • [2과목] 1. 데이터 입출력 구현 (6)
        • [2과목] 2. 통합 구현 (3)
        • [2과목] 3. 제품 소프트웨어 패키징 (7)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    면접을 위한 cs 전공지식 노트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
seong-morning
3. 전략 패턴
상단으로

티스토리툴바