[면접을 위한 CS 전공지식 노트] 디자인 패턴 - 전략 패턴

Yijun Jeon·2023년 12월 28일
0

CS 전공지식

목록 보기
3/21
post-thumbnail

디자인 패턴

💡 디자인 패턴이란?

  • 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 '규약' 형태로 만들어 놓은 것

전략 패턴

💡 전략 패턴 (strategy pattern) 이란?

객체의 행위를 바꾸고 싶은 경우 '직접' 수정하지 않고 전략이라고 부르는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴

컨텍스트

  • 상황, 맥락, 문맥
  • 개발자가 어떠한 작업을 완료하는데 필요한 모든 관련 정보

🔗 실제 사용

  • Node.js - 인증 모듈 구현 - passport 미들웨어 라이브러리
    • LocalStrategy 전략 : 회원가입된 아이디와 비밀번호를 기반으로 인증
    • OAuth 전략 : 페이스북, 네이버 등 다른 서비스를 기반으로 인증

⭐️ 전략 패턴 활용 자바 예시 코드
👉 쇼핑 카트에 아이템을 담아 LUNACard 또는 KAKAOCard 라는 두 개의 전략으로 결제하는 코드

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 StrategyPattern{
	public static void main(String[] args){
		ShoppingCart cart = new ShoppingCart();

		Item A = new Item("kundolA",100);
		Item B = new Item("kundolB",200);

		cart.addItem(A);
		cart.addItem(B);

		// pay by LUNACard
		cart.pay(new LUNACardStrategy("kundol@example.com","temppwd"));

		// pay by KAKAOCard
		cart.pay(new KAKAOCardStrategy("Yijun","1234","123","8/13"));
	}
}

/*
300 paid using LUNACard.
400 paid using KAKAOCard.
*/

0개의 댓글