الگوی طراحی Strategy جزو الگوهای behavioral یا رفتاری ، در برنامه نویسی شی گرا می باشد ، این الگو در زمانی استفاده می شود  که  قرار است رفتار یک کد و یا برنامه در Runtime  تغییر پیدا کند ، مانند استراتژی یک تیم فوتبال که بسته به شرایط بازی ، می تواند تدافعی یا تهاجمی باشد .
از مزایای این الگوی طراحی حذف عبارات شرطی است و لازم نیست 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