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 ์ ๋ต ์ ๊ณต