CS/๋””์ž์ธํŒจํ„ด

์ „๋žต ํŒจํ„ด(Strategy pattern)

leeh96 2023. 1. 18. 21:53

์ „๋žต ํŒจํ„ด (ํ–‰์œ„ ํŒจํ„ด)

์ •์ฑ… ํŒจํ„ด(policy pattern)์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ๊ฐ์ฒด์˜ ํ–‰์œ„๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ‘์ง์ ‘’ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ „๋žต์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ‘์บก์Аํ™”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜’์„ ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ๋ฐ”๊ฟ”์ฃผ๋ฉด์„œ ์ƒํ˜ธ ๊ต์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํŒจํ„ด์ด๋‹ค.

 

 

์žฅ์ 

์ปจํ…์ŠคํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด ์ƒˆ๋กœ์šด ์ „๋žต์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค

์ƒˆ๋กœ์šด ์ „๋žต์— ๋Œ€ํ•ด์„œ๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— OCP์˜ ์›์น™์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹จ์ 

๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ์ฒด์ ์ธ ์ „๋žต์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

 

์ž๋ฐ”์˜ ์ „๋žต ํŒจํ„ด

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 KAKAOCard
        cart.pay(new KAKAOCardStrategy("Ju hongchul", "123456789","123","12/01"));
    }
}
/*
400 paid using LUNACard.
400 paid using KAKAOCard.
*/

๊ฒฐ์ œ ๋ฐฉ์‹์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋Š” ์ „๋žต ํŒจํ„ด์ด๋‹ค.


 

์ „๋žต ํŒจํ„ด์„ ํ™œ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : passport
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);
        });
    }
));
=>  Node.js์—์„œ ์ธ์ฆ ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์“ฐ๋Š” ๋ฏธ๋“ค์›จ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
=>  ํŽ˜์ด์Šค๋ถ, ๋„ค์ด๋ฒ„ ๋“ฑ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆํ•˜๋Š” OAuth ์ „๋žต ์ œ๊ณต