728x90
728x90
디자인 패턴이란?
프로그램을 설계할 때 발생했던 문제점들을 해결 할 수 있도록 하나의 규약형태로 만들어 놓은 것.
전략 패턴
전략 패턴이란?
정책 패턴이라고도 하며 객체의 행위를 바꾸고 싶은 경우 직접 수정하는 것 이아닌,
전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주며 상호교체가 가능하게 만드는 패턴
가장 큰 예로 Passport.js 라이브러리가 있다.
예제 코드
패스포트를 구현 할 수는 없으니까 간략한 예시를 구현 해보자.
장바구니에 물건을 담고,
결제를 할 때 결제수단을 Strategy로 만드는 코드이다.
Strategy
package org.example.strategy;
public interface PaymentStrategy {
public void pay(int amount);
}
우선 인터페이스를 만들어주자.
모든 전략은 pay
라는 method를 가져야한다.
//Kakao
public class KakaoStrategy implements PaymentStrategy {
private final String name;
private final String cardNumber;
private final String cvv;
private final String expire;
public KakaoStrategy(String name, String cardNumber, String cvv, String expire) {
this.name = name;
this.cardNumber = cardNumber;
this.cvv = cvv;
this.expire = expire;
}
@Override
public void pay(int amount) {
System.out.printf("카카오로 %d원 긁음%n", amount);
}
}
// Naver
public class NaverStrategy implements PaymentStrategy{
private final String userId;
private final String userPw;
public NaverStrategy(String userId, String userPw) {
this.userId = userId;
this.userPw = userPw;
}
@Override
public void pay(int amount) {
System.out.printf("네이버로 %d원 긁음%n", amount);
}
}
실제로는 pay라는 method안에 각각의 로직을 구현하면 된다.
Item & ShoppingCart
// Item
public class Item {
private String name;
private int price;
public Item(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
// ShoppingCart
public class ShoppingCart {
List<Item> items;
public ShoppingCart() {
this.items = new ArrayList<>();
}
public void addItem(Item item) {
items.add(item);
}
public void removeItem(Item item) {
items.remove(item);
}
public int getTotalPrice() {
return items.stream()
.map(Item::getPrice)
.reduce(0, Integer::sum);
}
public void pay(PaymentStrategy paymentMethod) {
int amount = getTotalPrice();
paymentMethod.pay(amount);
}
}
shoppingCart 에 아이템을 담고 결제하면 담겨있는 아이템들의 총 금액이
인자로 전달받은 Strategy를 통해 결제 된다.
public static void main(String[] args) {
ShoppingCart shoppingCart = new ShoppingCart();
Item A = new Item("완두콩", 100);
Item B = new Item("강낭콩", 200);
shoppingCart.addItem(A);
shoppingCart.addItem(B);
PaymentStrategy Kakao = new KakaoStrategy("a","b","c","d");
PaymentStrategy Naver = new NaverStrategy("asdf","qwer");
shoppingCart.pay(Kakao);
shoppingCart.pay(Naver);
}
위와 같이 실행 시킬 수 있다.
728x90
728x90
'Study > CS' 카테고리의 다른 글
[CS] 디자인패턴 - 이터레이터, 노출모듈 (0) | 2023.01.09 |
---|---|
[CS] 디자인패턴 - 프록시 패턴(프록시 서버) (0) | 2023.01.09 |
[CS] 디자인패턴 - 옵저버 패턴 (0) | 2023.01.05 |
[CS] 디자인패턴 - 팩토리(if 없애기) (0) | 2023.01.05 |
[CS] 디자인 패턴 - 싱글톤 (0) | 2023.01.04 |
댓글