[CS] 디자인 패턴 - 전략 패턴, 정책 패턴

휘Bin·2023년 9월 6일
0
post-thumbnail

전략 패턴?

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

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

아래는 우리가 무엇을 살 때 애플페이, 카카오페이 등을 이용하는 것처럼, 어떤 아이템을 SUCCESSCard와 KAKAOCard로 살 때를 구현한 코드이다.
즉, '결제 방식의 전략'만 바꿔서 두 가지 방식으로 결제하는 것이다.

(JAVA)

import java.text.DecimalFormat;
import java.util.ArrayList;
imporg 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 + "by KAKAOCard");
    }
}

class SUCCESSCardStrategy implements PaymentStrategy {
	private String emailId;
    private String password;
    
    public SUCCESSCard(String email, Strign pwd) {
    	this.emailId = email;
        this.password = pwd;
    }
    
    @Override
    public void pay(int amount) {
    	System.out.println(amount + "by SUCCESSCard");
    }
}

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);
    }
}


전략패턴 - 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);
        });	
    }
));
profile
One-step, one-step, steadily growing developer

0개의 댓글

관련 채용 정보