از مزایای این الگوی طراحی حذف عبارات شرطی است و لازم نیست if else های مختلفی استفاده کنیم ، هم چنین لاجیک برنامه را می توانیم بین کلاس ها و اینترفیس های مختلف پخش نماییم .
در این الگوی طراحی ، کلاینت نیاز به دانستن استراتژی های مختلف برای استفاده از API مورد نظر را دارد و حتما باید با پیاده ساز های مختلف آشنایی داشته باشد .
فرض کنید که یک سیستم فروشگاه اینترنتی داریم و برای پرداخت کاربران ، استراتژی های مختلفی را می توانیم پیاده سازی کنیم ، مانند استراتژی پرداخت از طریق PayPal , MasterCard, درگاه های بانک های ایرانی و ... .
اول از همه نیاز به یک اینترفیس برای عملیات پرداخت داریم و تمامی استراتژی های مختلف ، باید این اینترفیس را پیاده سازی کنند :
public interface PaymentStrategy {
public void pay(float amount);
}
public class MellatBankStrategy implements PaymentStrategy {
@Override
public void pay(float amount) {
// do anything
System.out.println(amount + " MellatBankstrategy");
}
}
public class PayPalStrategy implements PaymentStrategy {
@Override
public void pay(float amount) {
// do anything
System.out.println(amount + " PayPal strategy");
}
}
public class MasterCardStrategy implements PaymentStrategy {
@Override
public void pay(float amount) {
// do anything
System.out.println(amount + " MasterCard");
}
}
حال بدنه اصلی کلاس پرداخت که درخواست های پرداخت کاربران را هندل می کند را پیاده سازی می کنیم :
public class PaymentSystem {
private float amount;
public void setAmount(float amount) {
this.amount = amount;
}
public float getAmount() {
return amount;
}
public void pay(PaymentStrategy paymentStrategy){
paymentStrategy.pay(this.amount);
}
}
حال می توان با استفاده از پیاده سازی های ارائه شده ، از انواع استراتژی های پرداخت در هنگام لزوم استفاده کرد ، بدون استفاده از شروط مختلف if else و دست کاری بیش از حد کدها :
public class main {
public static void main(String[] args) {
PaymentSystem paymentSystem = new PaymentSystem();
paymentSystem.setAmount(35000000);
paymentSystem.pay(new MellatBankStrategy());
}
}
//35000000.0 MellatBank strategy
در صورت نیاز ، به جای استفاده از MellatBankStrategy ، میتوانیم از استراتژی های دیگر استفاده کنیم :
public class main {
public static void main(String[] args) {
PaymentSystem paymentSystem = new PaymentSystem();
paymentSystem.setAmount(35000000);
paymentSystem.pay(new PayPalStrategy());
}
}
//35000000.0 PayPal strategy