نمط الاستراتيجية

في برمجة الحاسوب ، يُعد نمط الاستراتيجية (المعروف أيضًا بنمط السياسة ) نمطًا لتصميم البرمجيات السلوكية ، يُمكّن من اختيار خوارزمية أثناء التشغيل. فبدلاً من تنفيذ خوارزمية واحدة مباشرةً، يتلقى البرنامج تعليمات أثناء التشغيل لتحديد الخوارزمية التي سيتم استخدامها من بين مجموعة من الخوارزميات. [ 1 ]

تتيح الاستراتيجية للخوارزمية أن تتغير بشكل مستقل عن العملاء الذين يستخدمونها. [ 2 ] تُعدّ الاستراتيجية أحد الأنماط الواردة في كتاب أنماط التصميم المؤثر لغاما وآخرون [ 3 ] ، والذي ساهم في نشر مفهوم استخدام أنماط التصميم لوصف كيفية تصميم برمجيات كائنية التوجه مرنة وقابلة لإعادة الاستخدام. إن تأجيل قرار اختيار الخوارزمية إلى وقت التشغيل يسمح بأن يكون الكود المُستدعي أكثر مرونة وقابلية لإعادة الاستخدام.

على سبيل المثال، قد تستخدم فئةٌ تُجري عملية التحقق من صحة البيانات الواردة نمطَ الاستراتيجية لاختيار خوارزمية التحقق بناءً على نوع البيانات، ومصدرها، واختيار المستخدم، أو عوامل تمييزية أخرى. لا تُعرف هذه العوامل إلا أثناء التشغيل، وقد تتطلب إجراء عمليات تحقق مختلفة جذريًا. يمكن استخدام خوارزميات التحقق (الاستراتيجيات)، المُغلّفة بشكل منفصل عن كائن التحقق، من قِبل كائنات تحقق أخرى في مناطق مختلفة من النظام (أو حتى أنظمة مختلفة) دون تكرار التعليمات البرمجية .

عادةً، يقوم نمط الاستراتيجية بتخزين مرجع إلى الكود في بنية بيانات واسترجاعه. ويمكن تحقيق ذلك من خلال آليات مثل مؤشر الدالة الأصلي ، أو الدالة من الدرجة الأولى ، أو الفئات أو مثيلات الفئات في لغات البرمجة كائنية التوجه ، أو الوصول إلى التخزين الداخلي للكود في تطبيق اللغة عبر الانعكاس .

بناء

فئات UML ومخطط التسلسل

نموذج لفئة UML ومخطط تسلسل لنمط تصميم الاستراتيجية. [ 4 ]

في مخطط فئات UML أعلاه ، لا تُنفّذ الفئة خوارزميةً مباشرةً. بدلاً من ذلك، تُشير إلى واجهة تنفيذ الخوارزمية ( )، مما يجعلها مستقلةً عن كيفية تنفيذ الخوارزمية. تُنفّذ الفئتان و الواجهة، أي تُنفّذان (تُغلّفان) خوارزميةً. يُظهر مخطط تسلسل UML تفاعلات وقت التشغيل: يُفوّض الكائن خوارزميةً إلى كائناتٍ مختلفة. أولاً، يستدعي على كائنٍ، يُنفّذ الخوارزمية ويُعيد النتيجة إلى . بعد ذلك، يُغيّر استراتيجيته ويستدعي على كائنٍ، يُنفّذ الخوارزمية ويُعيد النتيجة إلى .ContextContextStrategystrategy.algorithm()ContextStrategy1Strategy2StrategyContextStrategyContextalgorithm()Strategy1ContextContextalgorithm()Strategy2Context

مخطط الفئات

نمط الاستراتيجية في لغة النمذجة الموحدة (UML)

[ 5 ]

نمط الاستراتيجية في LePUS3 ( المفتاح )

الاستراتيجية ومبدأ الانفتاح والانغلاق

يجب تحديد سلوكيات التسارع والفرملة في كل طراز سيارة جديد .

وفقًا لنمط الاستراتيجية، لا ينبغي توريث سلوكيات الفئة، بل يجب تغليفها باستخدام الواجهات. وهذا يتوافق مع مبدأ الانفتاح والإغلاق (OCP)، الذي ينص على أن تكون الفئات مفتوحة للتوسيع ولكنها مغلقة للتعديل.

كمثال، لنفترض وجود فئة سيارة. من بين الوظائف الممكنة للسيارة: الكبح والتسارع . ونظرًا لتغير سلوكيات التسارع والكبح بشكل متكرر بين النماذج، فإن النهج الشائع هو تنفيذ هذه السلوكيات في فئات فرعية. إلا أن هذا النهج ينطوي على عيوب جوهرية؛ إذ يجب تعريف سلوكيات التسارع والكبح في كل نموذج سيارة جديد. ويزداد عبء إدارة هذه السلوكيات بشكل كبير مع ازدياد عدد النماذج، مما يستلزم تكرار الشيفرة البرمجية بين النماذج. إضافةً إلى ذلك، يصعب تحديد طبيعة السلوك بدقة لكل نموذج دون فحص الشيفرة البرمجية الخاصة به.

يستخدم نمط الاستراتيجية التركيب بدلاً من الوراثة . في هذا النمط، تُعرَّف السلوكيات كواجهات منفصلة وفئات محددة تُنفِّذ هذه الواجهات. يتيح ذلك فصلًا أفضل بين السلوك والفئة التي تستخدمه. يمكن تغيير السلوك دون التأثير على الفئات التي تستخدمه، ويمكن للفئات التبديل بين السلوكيات بتغيير التنفيذ المحدد المستخدم دون الحاجة إلى أي تغييرات جوهرية في الكود. كما يمكن تغيير السلوكيات أثناء التشغيل وكذلك أثناء التصميم. على سبيل المثال، يمكن تغيير سلوك فرامل كائن السيارة من BrakeWithABS()إلى Brake()بتغيير brakeBehaviorالعضو إلى:

Brake * brakeBehavior = new Brake ();
package org.wikipedia.examples ;/* مجموعة خوارزميات مغلفة * واجهة وتطبيقاتها */ interface IBrakeBehavior { public void brake (); }class BrakeWithABS implements IBrakeBehavior { public void brake () { System . out . println ( "تم تفعيل نظام منع انغلاق المكابح ( ABS)" ); } }class Brake implements IBrakeBehavior { public void brake () { System . out . println ( "تم تطبيق الفرامل البسيطة" ); } }// عميل يمكنه استخدام الخوارزميات المذكورة أعلاه بشكل تبادلي فئة مجردة Car { سلوك الفرامل الخاص IBrakeBehavior brakeBehavior ;public Car ( IBrakeBehavior brakeBehavior ) { this . brakeBehavior = brakeBehavior ; }public void applyBrake () { brakeBehavior . brake (); }public void setBrakeBehavior ( IBrakeBehavior BrakeType ) { this . BrakeBehavior = نوع الفرامل ؛ } }// يستخدم العميل 1 خوارزمية واحدة (Brake) في فئة المُنشئ Sedan extends Car { public Sedan () { super ( new Brake ()); } }// يستخدم العميل 2 خوارزمية أخرى (BrakeWithABS) في فئة المُنشئ SUV التي تمتد من Car { public SUV () { super ( new BrakeWithABS ()); } }// باستخدام مثال السيارة public class CarExample { public static void main ( String [] arguments ) { Car sedanCar = new Sedan (); sedanCar . applyBrake (); // سيؤدي هذا إلى استدعاء الفئة "Brake"Car suvCar = new SUV (); suvCar.applyBrake ( ); // سيؤدي هذا إلى استدعاء الفئة "BrakeWithABS "// ضبط سلوك الفرامل ديناميكيًا suvCar.setBrakeBehavior ( new Brake ()); suvCar.applyBrake ( ); // سيؤدي هذا إلى استدعاء الفئة "Brake " } }

انظر أيضاً

مراجع

  1. "نمط تصميم الاستراتيجية - المشكلة والحل والتطبيق" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
  2. إريك فريمان، إليزابيث فريمان، كاثي سييرا، وبيرت بيتس، أنماط التصميم من Head First ، الطبعة الأولى، الفصل 1، الصفحة 24، دار نشر O'Reilly Media، 2004. ISBN 978-0-596-00712-6
  3. إريك غاما، ريتشارد هيلم، رالف جونسون، جون فليسيدس (1994). أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات . أديسون ويسلي. ص 315 وما بعدها . ISBN  0-201-63361-2.{{cite book}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط )
  4. "نمط تصميم الاستراتيجية - الهيكلة والتعاون" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
  5. "مرجع سريع لأنماط التصميم - ماكدونالد لاند" .