شرح Strategy Design Pattern بالتفصيل مع مثال عملي في Java
إذا كنت ترغب في بناء كود مرن يسمح لك بتغيير طريقة تنفيذ العمليات بدون تعديل الكود الأساسي، فإن Strategy Design Pattern هو أحد أفضل الحلول التي يمكنك استخدامها.
يُعتبر هذا النمط من أنماط التصميم السلوكية (Behavioral Design Patterns)، ويُستخدم بشكل واسع في الأنظمة التي تحتوي على أكثر من طريقة لتنفيذ نفس العملية.
ببساطة، هذا النمط يساعدك على فصل الخوارزميات (Algorithms) عن الكود الرئيسي، مما يجعل التطبيق أكثر مرونة وقابلية للتطوير.
ما هو Strategy Design Pattern؟
بدلاً من استخدام if/else أو switch لتحديد السلوك، يتم استخدام Interface موحد يحتوي على السلوك العام، ويتم تنفيذ هذا السلوك بطرق مختلفة.
هذا النمط يعتمد على مبدأ Composition over Inheritance، أي الاعتماد على التركيب بدلاً من الوراثة.
فكرة النمط بطريقة بسيطة
– الدفع بالبطاقة (Credit Card) – الدفع عبر PayPal – الدفع نقدًا
جميعها تقوم بنفس العملية (الدفع)، لكن بطريقة مختلفة.
هنا يأتي دور Strategy Design Pattern لتنظيم هذه الاختلافات بشكل احترافي.
مثال بدون استخدام Strategy Design Pattern
public class WithoutStrategyExample {
public static void main(String[] args) {
String paymentMethod = "CreditCard";
int amount = 100;
if (paymentMethod.equals("CreditCard")) {
System.out.println("Paid " + amount + " using Credit Card");
} else if (paymentMethod.equals("PayPal")) {
System.out.println("Paid " + amount + " using PayPal");
}
}
}
مشاكل الطريقة التقليدية
مثال باستخدام Strategy Design Pattern
// Strategy Interface
interface PaymentStrategy {
void pay(int amount);
}
// Credit Card Strategy
class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
public CreditCardPayment(String cardNumber) {
this.cardNumber = cardNumber;
}
public void pay(int amount) {
System.out.println("Paid " + amount + " using Credit Card: " + cardNumber);
}
}
// PayPal Strategy
class PayPalPayment implements PaymentStrategy {
private String email;
public PayPalPayment(String email) {
this.email = email;
}
public void pay(int amount) {
System.out.println("Paid " + amount + " using PayPal: " + email);
}
}
// Context
class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}
// Main
public class StrategyPatternExample {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardPayment("1234-5678"));
cart.checkout(100);
cart.setPaymentStrategy(new PayPalPayment("user@example.com"));
cart.checkout(250);
}
}
شرح كيف يعمل Strategy Pattern
بهذا الشكل يمكن تغيير السلوك بسهولة بدون تعديل الكود الأساسي.
الفرق بين الطريقتين
Strategy Pattern يسمح بتغيير السلوك بسهولة.
قابلية التوسع
يمكن إضافة استراتيجيات جديدة بدون تعديل الكود.
تنظيم الكود
كل خوارزمية في كلاس منفصل.
مميزات Strategy Design Pattern
تغيير السلوك أثناء التشغيل بسهولة.
فصل المنطق
كل خوارزمية منفصلة عن الأخرى.
إعادة الاستخدام
يمكن استخدام نفس الاستراتيجية في أكثر من مكان.
سهولة التوسع
إضافة استراتيجيات جديدة بسهولة.
عيوب Strategy Design Pattern
قد يكون غير ضروري في الحالات البسيطة.
عدد كبير من الكلاسات
كل استراتيجية تحتاج كلاس منفصل.
متى تستخدم Strategy Design Pattern؟
أفضل استخدامات النمط
الخلاصة
بدلاً من استخدام if/else، يمكنك فصل كل سلوك في كلاس مستقل، مما يجعل الكود أكثر وضوحًا وسهولة في الصيانة.
ورغم أنه يزيد عدد الكلاسات، إلا أنه يوفر تحكمًا كبيرًا في سلوك التطبيق.
ببساطة: إذا كان لديك عملية واحدة ولكن طرق تنفيذها متعددة، فإن هذا النمط هو الخيار الأفضل.
مثل: عملية الدفع تختلف حسب الوسيلة، لكن الهدف النهائي واحد.
لمزيد من المقالات يمكنك مشاهده : كيفيةإزالة MySQL من macOS خطوة بخطوة بدون ترك أي بقايا



