الگوی استراتژی

در برنامه‌نویسی کامپیوتر الگوی استراتژی (همچنین به عنوان الگوی سیاست و الگوی راهبردگُزین نیز شناخته می‌شود) است یک الگوی طراحی نرم‌افزار رفتاری است که قابلیت انتخاب یک الگوریتم در زمان اجرا را ممکن می‌سازد.

در الگوی استراتژی:

 یک میانای (Interface) تعریف می‌شود.
 چندین راهبرد جداگانه اما در پیوند با یک زمینهٔ ویژه، پیاده‌سازی می‌گردد.
 هر راهبرد در کلاس جداگانه پوشانده (Encapsulate) می‌شود و شگرد (Method) همسان برای اجرا دارد.
 میانای، مرجعی به یک راهبرد اولیه نگه می‌دارد و در زمان اجرا (Runtime) می‌تواند راهبردها را با یکدیگر جایگزین کند؛ بنابراین راهبردها جایگزین‌پذیر هستند.

الگوی استراتژی اجازه می‌دهد تا الگوریتم‌های گوناگون به شکل جداگانه و مستقل از کارخواه اجرا شوند.Eric Freeman, Elisabeth Freeman, Kathy Sierra and Bert Bates, Head First Design Patterns, First Edition, Chapter 1, Page 24, O'Reilly Media, Inc, 2004.  الگوی استراتژی یکی از الگوهای موجود در کتاب مشهور الگوهای طراحی است که توسط گاما و دیگران نوشته شده‌است و مفهوم استفاده از الگوهای طراحی برای توصیف نحوه طراحی انعطاف‌پذیر و قابل استفاده مجدد شی گرا در نرم‌افزار را محبوب ساخت. هدف از الگوی راهبردگزین، جداکردن الگوریتم‌ها از مصرف‌کننده تا بتوان الگوریتم‌ها را بدون تغییر مایانای افزوده یا تغییر داد.

 نمونه‌ای از کدها 
یک نمونهٔ ساده با استفاده از زبان برنامه‌نویسیِ پایتون:from abc import ABC, abstractmethod

class Strategy(ABC):
    @abstractmethod
    def execute(self, data):
        pass

class StrategyA(Strategy):
    def execute(self, data):
        # simple ascending sort
        return sorted(data)

class StrategyB(Strategy):
    def execute(self, data):
        # descending sort
        return list(reversed(sorted(data)))

class Context:
    def __init__(self, strategy: Strategy):
        self._strategy = strategy

    @property
    def strategy(self):
        return self._strategy

    @strategy.setter
    def strategy(self, strategy: Strategy):
        self._strategy = strategy

    def do_work(self, data):
        result = self._strategy.execute(data)
        print(",".join(result))

# Usage
data = ["a", "c", "b"]
ctx = Context(StrategyA())
ctx.do_work(data)        # ascending
ctx.strategy = StrategyB()
ctx.do_work(data)        # descending

همچنین یک نمونهٔ دیگر با زبان تایپ‌اسکریپت:// Strategy interface
interface Strategy {
  execute(data: string[]): string[];
}

// Concrete strategies
class AscendingStrategy implements Strategy {
  execute(data: string[]): string[] {
    return [...data].sort();
  }
}

class DescendingStrategy implements Strategy {
  execute(data: string[]): string[] {
    return [...data].sort().reverse();
  }
}

// Context
class Context {
  private strategy: Strategy;

  constructor(strategy: Strategy) {
    this.strategy = strategy;
  }

  setStrategy(strategy: Strategy) {
    this.strategy = strategy;
  }

  execute(data: string[]) {
    const result = this.strategy.execute(data);
    console.log(result.join(','));
  }
}

// Usage
const data = ['a', 'c', 'b'];
const ctx = new Context(new AscendingStrategy());
ctx.execute(data);         // ascending
ctx.setStrategy(new DescendingStrategy());
ctx.execute(data);         // descending

 نمودارِ کلاس 
هیچ|بندانگشتی|256x256پیکسل|الگوی استراتژی در UML

 جستارهای وابسته 
 تزریق نیازمندی
 تابع مرتبه‌بالا
 Entity-component-system

 منابع 

رده:الگوهای طراحی نرم‌افزار