نموذج الإستراتيجية  يعتبر نموذج الإستراتيجية (نمط الاستراتيجية) أو (خطة العمل) (The policy pattern) واحداً من أنماط تصميم البرمجيات التصرفية (السلوكية) في مجال هندسة البرمجيات التي وضعها جماعة الأربعة في كتابهم المعروف (نماذج التصميم). يستعمل هذا النموذج (النمط) بالتحديد كي يتم اختيار الخوارزمية المناسبة أثناء تشغيل البرنامج . بدلا من تنفيذ خوارزمية واحدة مباشرة، الكود يستقبل التعليمات اثناء التشغيل ليحدد الخوارزمية المناسبة لاستخدامها. بعبارة أخرى، فإن هذا النموذج يعرّف عددا من الخوارزميات ويجعلهم مغلفين بحيث يمكن أن تحل إحداها محل الأخرى.  على سبيل المثال، يمكن تطبيق نموذج الإستراتيجية في حالة صنف (Class) يقوم بعملية التحقق من صحة البيانات المدخلة . حيث يمكن أن يكتب البرنامج بطريقة تجعله يختار الخوارزمية المناسبة تلقائيا بناءً على نوع البيانات المدخلة أو على مصدر هذه البيانات أو على أي عامل آخر. ما يهم هنا هو أن هذا العامل لا تتم معرفته، وبالتالي تحديد الخوارزمية، إلا أثناء تشغيل البرنامج. يمكن استخدام خوارزميات التحقق (الاستراتيجيات)، المغلفة بشكل منفصل عن كائن التحقق ، من قبل كائنات التحقق الأخرى في مجالات مختلفة من النظام (أو حتى أنظمة مختلفة) دون تكرار الكود البرمجي . عادة يقوم نمط الإستراتيجية بتخزين عنوان مرجعي لبعض الكود في بنية بيانات ويستردها . يمكن تحقيق ذلك من خلال آليات مثل مؤشر الدالة الأصلية ، أو دالة من الصنف الأول ، أو الاصناف أو مثيلات الصنف في لغات البرمجة الكائنية ، أو الوصول إلى التخزين الداخلي لتطبيق اللغة الخاص بالكود عبر الانعكاس .  .في مخطط الصنف UML أعلاه، لا يطبق صنف السياق خوارزمية مباشرة. بدلاً من ذلك، يشير السياقContext إلى واجهة الإستراتيجية Strategy interface لتنفيذ خوارزمية (()Strategy.algorithm)، مما يجعل السياقContext مستقلاً عن كيفية تطبيق الخوارزمية. صنفا الإستراتيجية Strategy1 والاستراتيجية 2 ينفذا واجهة الإستراتيجية ، أي تنفيذ (تغليف) خوارزمية. يعرض مخطط التتابع UML تفاعلات وقت التشغيل : يقوم كائن السياق بتفويض خوارزمية لكائنات إستراتيجية مختلفة. أولاً، يستدعيContext السياق خوارزمية ()algorithm على كائن Strategy1 ، الذي ينفذ الخوارزمية ويعيدreturns النتيجة إلى السياقContext. بعد ذلك، يغير السياقContext استراتيجيته ويستدعي ()algorithm على كائن Strategy2 ، الذي ينفذ الخوارزمية ويعيد النتيجة إلى السياق.  المثال التالي بلغة برمجة سي شارب : public class StrategyPatternWiki  class Customer  interface IBillingStrategy  // Normal billing strategy (unchanged price) class NormalStrategy : IBillingStrategy  // Strategy for Happy hour (50% discount) class HappyHourStrategy : IBillingStrategy  مثال بلغة برمجة جافا Java import java.util.ArrayList;  interface BillingStrategy {  class Customer {  public class StrategyPattern {  إستراتيجية ومبدأ مفتوح مغلق وفقًا لنمط الإستراتيجية، لا ينبغي أن تُتوارث سلوكيات الصنف . بدلاً من ذلك، يجب تغليفها باستخدام الواجهات . هذا متوافق مع مبدأ مفتوح / مغلق ، الذي يقترح أن الأصناف يجب أن تكون مفتوحة للتمديد ولكن مغلقة للتعديل .  كمثال، ضع في اعتبارك صنف السيارة. وظيفتان محتملتان للسيارة هما الفرملة والتسارع . نظرًا لأن سلوكيات التسارع والفرملة تتغير بشكل متكرر بين النماذج ، فإن النهج المشترك هو تنفيذ هذه السلوكيات في الأصنف الفرعية . هذا النهج له عيوب كبيرة : يجب الإعلان عن سلوكيات التسارع والفرامل في كل طراز سيارة جديد . يزداد عمل إدارة هذه السلوكيات بشكل كبير مع زيادة عدد النماذج ، ويتطلب تكرار الكود عبر النماذج . بالإضافة إلى ذلك، ليس من السهل تحديد الطبيعة الدقيقة للسلوك لكل نموذج دون التحقق من الكود في كل نموذج.  يستخدم نمط الاستراتيجية التركيب بدلاً من الوراثة . في نمط الاستراتيجية، يتم تعريف السلوكيات على أنها واجهات منفصلة وأصناف محددة تنفذ هذه الواجهات . هذا يسمح بفصل أفضل بين السلوك والصنف الذي يستخدم السلوك . يمكن تغيير السلوك دون كسر الاصناف التي تستخدمه، ويمكن للأصناف التبديل بين السلوكيات عن طريق تغيير التنفيذ المحدد المستخدم دون الحاجة إلى أي تغييرات كبيرة في الكود . يمكن أيضًا تغيير السلوكيات في وقت التشغيل وكذلك في وقت التصميم . على سبيل المثال، يمكن تغيير سلوك فرامل كائن السيارة من دالة الفرملة مع ABS إلى دالة الفرملة عن طريق تغيير عضو سلوك الفرامل brakeBehavior إلى: brakeBehavior = new Brake(); /* Encapsulated family of Algorithms public interface IBrakeBehavior {  public class BrakeWithABS implements IBrakeBehavior {  public class Brake implements IBrakeBehavior {  /* Client that can use the algorithms above interchangeably */ public abstract class Car {  /* Client 1 uses one algorithm (Brake) in the constructor */ public class Sedan extends Car {  /* Client 2 uses another algorithm (BrakeWithABS) in the constructor */ public class SUV extends Car {  /* Using the Car example */ public class CarExample {