در این قسمت تیم کدگیت را با آموزش Strategy پترن در جاوا همراهی کنید. در ابتدای این جلسه ما توضیح کوتاهی از این پترن خواهیم داد سپس یکی از کتابخانههای جاوا که از Strategy پترن استفاده کرده است را ذکر میکنیم و در پایان کار طبق روال آموزشهای گذشته یک مثال واقعی که از این پترن استفاده کرده را پیاده سازی می کنیم. پیش نیاز این آموزش شامل موارد زیر میباشد:
- شی گرایی در جاوا
- متد در جاوا
- Constructor در جاوا
- This در جاوا
- Interface در جاوا
- ArrayList در جاوا
- ارث بری در جاوا
Behavioral Design Pattern
یکی از زیر شاخههای دیزاین پترن Behavioral Design Pattern میباشد. یکی از وظایف اصلی این دیزاین پترن، تعامل اشیا و جداسازی وظایف آنها با یکدیگر است. تعریف کامل Behavioral Design Pattern بدین صورت است که، تمامی اشیا با یکدیگر به راحتی بتوانند ارتباط برقرار کرده، بدون آنکه باعث وابستگی بین آنها شود.
Strategy پترن در جاوا
در Strategy پترن رفتار کلاس یا روش آن در زمان اجرا تغییر میکند. برای توضیح این پترن در دنیای واقعی، مثال یک برنامهنویس را میزنیم. اگر زبان برنامهنویسی برای کاری مهم نباشد ممکن است مشتری درخواست پروژهای با UI داشته باشد. یک برنامه نویس جاوا را انتخاب کرده و برنامه نویس دیگری سی شارپ. برای مشتری اهمیتی ندارد چه زبان برنامهنویسی انتخاب شود و جزییات را بر عهده برنامه نویس میگذارد. همچنین در هر مرحله میتوان زبانبرنامه نویسی را تغییر داد (بسته به تصمیم برنامهنویس).
دیاگرام Strategy پترن در جاوا در زیر آورده شده است. همانطور که مشاهده میکنید، این دیاگرام شبیه به State پترن است. در هر دو پترن یک کلاس Context و یک Interface وجود دارد.در این دیاگرام کلاس Strategy مثل انتخاب زبان برنامه نویسی است که با توجه به صدا زدن Main برنامه و در زمان اجرا تغییر میکند. یکی از مثال های این پترن کلاس Collection.sort است که با توجه به interface به نام Comparable کار میکند.

مثال Strategy پترن در جاوا
در این قسمت یک مثال از Strategy پترن خواهیم زد. فرض کنید میخواهیم یک برنامه کارت اعتباری را برای مغازهای بنویسید. در این برنامه دو نوع روش PayPal و کارت بانکی برای پرداخت (یک محصول از مغازه) داریم. حال با توجه به فرضیات گفته شده به دیاگرام زیر توجه کنید:

یک Interface برای روش پرداخت (Strategy) نوشته شده و یک کلاس به نام Context (همان Shopping cart) برای استفاده از Strategy نوشته شده است(کلاسهای دیگر، کلاس های کمکی هستند). کد این مثال به صورت زیر است:
public interface PaymentStrategy {
public void pay(int amount);
}
public class PaypalStrategy implements PaymentStrategy {
private String emailId;
private String password;
public PaypalStrategy(String email, String pwd) {
this.emailId = email;
this.password = pwd;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid using Paypal.");
}
}
public class CreditCardStrategy implements PaymentStrategy {
private String name;
private String cardNumber;
private String cvv;
private String dateOfExpiry;
public CreditCardStrategy(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 with credit/debit card");
}
}
public class Item {
private String upcCode;
private int price;
public Item(String upc, int cost) {
this.upcCode = upc;
this.price = cost;
}
public String getUpcCode() {
return upcCode;
}
public int getPrice() {
return price;
}
}
public class ShoppingCart {
// List of items
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);
}
}
تست مثال Strategy پترن در جاوا
برای تست کدهای بالا،کد Main زیر را اجرا کنید:
public class ShoppingCartTest {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
Item item1 = new Item("1234", 10);
Item item2 = new Item("5678", 40);
cart.addItem(item1);
cart.addItem(item2);
// pay by paypal
cart.pay(new PaypalStrategy("no-reply@Codegate.com", "mypwd"));
// pay by credit card
cart.pay(new CreditCardStrategy("Saeed Gharibi", "1234567890123456",
"786", "12/15"));
}
}
خروجی برنامه به صورا زیر میباشد:
50 paid using Paypal.
50 paid with credit/debit card