نمط Strategy: خوارزميات قابلة للتبديل
غلّف خوارزميات الفرز أو الدفع خلف واجهة Strategy لإتاحة التبديل أثناء التشغيل
نمط Strategy: خوارزميات قابلة للتبديل درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
نية Strategy
يعرّف Strategy عائلةً من الخوارزميات، ويغلف كل خوارزمية، ويجعلها قابلةً للتبديل. كما يتيح تغيير الخوارزمية باستقلال عن السياق الذي يستخدمها.
المشكلة من دون Strategy
من دون Strategy، يكون اختيار الخوارزمية مدفونًا في سلاسل من if-else. وتعني إضافة خوارزمية جديدة تعديل فئة السياق، مما يخالف مبدأ الانفتاح والإغلاق.
public double sort(List<Integer> data, String method) {
if (method.equals("bubble")) { /* bubble sort */ }
else if (method.equals("merge")) { /* merge sort */ }
// adding quicksort requires editing this class
}واجهة Strategy
عرّف @FunctionalInterface أو واجهةً عادية تمثل عقد الخوارزمية. وتغلف كل عملية تنفيذ خوارزميةً مختلفة.
public interface SortStrategy {
void sort(List<Integer> data);
}
public class BubbleSortStrategy implements SortStrategy {
public void sort(List<Integer> data) { /* bubble sort logic */ }
}
public class QuickSortStrategy implements SortStrategy {
public void sort(List<Integer> data) { Collections.sort(data); }
}فئة السياق
يحتفظ السياق بمرجع إلى استراتيجية ويفوّض إليها تنفيذ الخوارزمية. ويمكن تبديل الاستراتيجية في وقت التشغيل.
public class Sorter {
private SortStrategy strategy;
public Sorter(SortStrategy strategy) { this.strategy = strategy; }
public void setStrategy(SortStrategy s) { this.strategy = s; }
public void sort(List<Integer> data) { strategy.sort(data); }
}تبديل الاستراتيجيات في وقت التشغيل
غيّر الاستراتيجية أثناء التشغيل من دون تعديل السياق. ويجعل ذلك السلوك قابلًا للتهيئة من خارج الفئة.
Sorter sorter = new Sorter(new BubbleSortStrategy());
sorter.sort(data); // uses bubble sort
sorter.setStrategy(new QuickSortStrategy());
sorter.sort(data); // now uses quick sortاستراتيجيات Lambda
عندما تكون واجهة الاستراتيجية من نوع @FunctionalInterface، استخدم عبارات lambda مباشرة، فلا حاجة إلى فئات صريحة للاستراتيجيات البسيطة.
Sorter sorter = new Sorter(data -> Collections.sort(data)); // lambda strategy
// or method reference:
Sorter sorter2 = new Sorter(Collections::sort);Strategy لمعالجة المدفوعات
من الاستخدامات الكلاسيكية في العالم الحقيقي: يقبل سياق الدفع استراتيجيات دفع مختلفة، مثل بطاقة الائتمان وPayPal والعملات المشفرة، من دون معرفة تفاصيل كل منها.
public interface PaymentStrategy {
void pay(double amount);
}
new PaymentProcessor(new CreditCardStrategy("4111...")).pay(99.99);
new PaymentProcessor(new PayPalStrategy("user@email.com")).pay(99.99);Strategy للضغط
يمكن لمعالج الملفات استخدام CompressionStrategy. وأضف GZIP أو ZIP أو LZ4 من دون تغيير مسار معالجة الملفات.
public interface CompressionStrategy {
byte[] compress(byte[] data) throws IOException;
}
public class GzipStrategy implements CompressionStrategy {
public byte[] compress(byte[] data) throws IOException { /* gzip */ return new byte[0]; }
}دمج Strategy مع Factory
استخدم مصنعًا لاختيار الاستراتيجية استنادًا إلى الإعدادات، مع إبقاء منطق الاختيار منفصلًا عن السياق وعن الاستراتيجيات نفسها.
SortStrategy strategy = switch (config.getSortMethod()) {
case "bubble" -> new BubbleSortStrategy();
case "merge" -> new MergeSortStrategy();
default -> Collections::sort;
};
new Sorter(strategy).sort(data);Strategy مقابل Template Method
يستخدم Template Method التوريث: يكون الهيكل العام في الفئة الأساسية، وتعيد الفئات الفرعية تعريف الخطوات. أما Strategy فتستخدم التركيب، إذ تكون الخوارزمية خارجية بالكامل. ويُفضّل Strategy لتوفير مرونة أكبر.
الاستراتيجية في JDK
يُعدّ Comparator التطبيق المرجعي لنمط الاستراتيجية في JDK. مرّروا مقارنات مختلفة إلى Collections.sort لتغيير خوارزمية الترتيب دون المساس بشفرة المجموعة.
List<String> names = List.of("Bob", "Alice", "Charlie");
names.stream().sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);اختبار الاستراتيجيات
من السهل اختبار الاستراتيجيات بمعزل عن غيرها؛ فما عليكم سوى استدعاء strategy.sort(data) في اختبار وحدات. احقنوا استراتيجيات وهمية في السياق لاختبار منطق تنسيق السياق.
تحقق سريع
ما الفرق البنيوي الأساسي بين Strategy وTemplate Method؟
مراجعة
يغلف نمط الاستراتيجية خوارزميات قابلة للتبديل خلف واجهة مشتركة. استخدموا lambdas للاستراتيجيات البسيطة، والفئات للاستراتيجيات المعقدة. ادمجوا الاستراتيجيات مع المصانع لاختيارها اعتمادًا على الإعدادات.
الأسئلة الشائعة
هل درس «نمط Strategy: خوارزميات قابلة للتبديل» مجاني؟
نعم — نص درس «نمط Strategy: خوارزميات قابلة للتبديل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «نمط Strategy: خوارزميات قابلة للتبديل»؟
غلّف خوارزميات الفرز أو الدفع خلف واجهة Strategy لإتاحة التبديل أثناء التشغيل تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «نمط Strategy: خوارزميات قابلة للتبديل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نمط Observer: إشعارات الأحداث
- نمط Strategy: خوارزميات قابلة للتبديل
- نمط Command: تغليف الإجراءات
- نمط Template Method: تعريف هياكل الخوارزميات