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

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

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

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

الگوی استراتژی اجازه می‌دهد تا الگوریتم‌های گوناگون به شکل جداگانه و مستقل از کارخواه اجرا شوند.[۲] الگوی استراتژی یکی از الگوهای موجود در کتاب مشهور الگوهای طراحی است که توسط گاما و دیگران نوشته شده‌است و مفهوم استفاده از الگوهای طراحی برای توصیف نحوه طراحی انعطاف‌پذیر و قابل استفاده مجدد شی گرا در نرم‌افزار را محبوب ساخت. هدف از الگوی راهبردگزین، جداکردن الگوریتم‌ها از مصرف‌کننده تا بتوان الگوریتم‌ها را بدون تغییر مایانای افزوده یا تغییر داد.

نمونه‌ای از کدها

یک نمونهٔ ساده با استفاده از زبان برنامه‌نویسیِ پایتون:

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

نمودارِ کلاس

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

جستارهای وابسته

منابع

  1. «سامانه واژه‌یار - برابرنهاد مصوب برای «Strategy» در فرهنگستان». vajeyar.apll.ir. دریافت‌شده در ۲۰۲۵-۱۰-۱۲.
  2. Eric Freeman, Elisabeth Freeman, Kathy Sierra and Bert Bates, Head First Design Patterns, First Edition, Chapter 1, Page 24, O'Reilly Media, Inc, 2004. شابک ۹۷۸−۰−۵۹۶−۰۰۷۱۲−۶
  3. "Strategy in TypeScript / Design Patterns". refactoring.guru (به انگلیسی). Retrieved 2025-10-12.