معرفی الگوی طراحی Command

معرفی الگوی طراحی Command

مدت مطالعه : 3 دقیقه

17 اردیبهشت 1402

الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرم‌افزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفه‌جویی در زمان و تولید کد های با کیفیت، توسعه‌پذیر و انعطاف‌پذیر استفاده می‌کنیم. در این مطلب قصد داریم الگوی طراحی Command را معرفی کنیم.

الگوی طراحی Command یک الگوی طراحی رفتاری(behavioral) است که یک درخواست را به عنوان یک شی کپسوله می کند و فرستنده درخواست را از گیرنده درخواست جدا می کند. به عبارت ساده تر، به شما این امکان را می دهد که یک شی "Command" ایجاد کنید که حاوی تمام اطلاعات لازم برای اجرای یک عمل یا درخواست خاص است، که می تواند بعد تر اجرا شود. الگوی Command اجازه ایجاد دستورات قابل استفاده مجدد را می دهد که می توانند به راحتی تغییر یا ترکیب شوند تا رفتارهای پیچیده تری ایجاد کنند.

الگوی Command از اجزاء زیر تشکیل شده است:

  • Command: رابطی را برای همه دستورات(Command) تعریف می کند.
  • Concrete Command: رابط Command را پیاده سازی می کند و حاوی اطلاعات لازم برای اجرای یک دستور خاص است.
  • Invoker: اجرای یک دستور را با فراخوانی متدی روی شیء Command درخواست می کند.
  • Receiver: شیئی که عملیات Command بر روی آن انجام می‌شود.

در ادامه یک مثال از الگوی Command در زبان C# قرار گرفته است:

// Receiver: Light
public class Light
{
    public void TurnOn()
    {
       Console.WriteLine("Light is turned on");
    }
    public void TurnOff()
    {
       Console.WriteLine("Light is turned off");
    }
}
// Command interface
public interface ICommand
{
    void Execute();
}
// Concrete command: TurnOnCommand
public class TurnOnCommand : ICommand
{
    private readonly Light _light;
    public TurnOnCommand(Light light)
    {
        _light = light;
    }
    public void Execute()
    {
        _light.TurnOn();
    }
}
// Concrete command: TurnOffCommand
public class TurnOffCommand : ICommand
{
    private readonly Light _light;
    public TurnOffCommand(Light light)
    {
        _light = light;
    }
    public void Execute()
    {
        _light.TurnOff();
    }
}
// Invoker: Switch
public class Switch
{
    private ICommand _turnOnCommand;
    private ICommand _turnOffCommand;
    public Switch(ICommand turnOnCommand, ICommand turnOffCommand)
    {
        _turnOnCommand = turnOnCommand;
        _turnOffCommand = turnOffCommand;
    }
    public void TurnOn()
    {
       _turnOnCommand.Execute();
    }
    public void TurnOff()
    {
       _turnOffCommand.Execute();
    }
}
// Example usage
var light = new Light();
var turnOnCommand = new TurnOnCommand(light);
var turnOffCommand = new TurnOffCommand(light);
var switchObj = new Switch(turnOnCommand, turnOffCommand);
switchObj.TurnOn(); // Output: "Light is turned on"
switchObj.TurnOff(); // Output: "Light is turned off"

در این مثال، کلاس Light به عنوان Receiver عمل می کند و متد هایی را برای روشن و خاموش کردن ارائه می دهد. کلاس های TurnOnCommand و TurnOffCommand دستوراتی هستند که رابط ICommand را پیاده سازی می کنند و یک شی Light را در سازنده خود دریافت می کنند.

کلاس Switch به عنوان Invoker عمل می کند و دستوراتی که قرار است اجرا کند را از طریق متد سازنده دریافت می‌کند.

هنگامی که TurnOn روی شی Switch فراخوانی می شود، TurnOnCommand را اجرا می کند که متد TurnOn را روی شی Light فراخوانی می کند و در نتیجه پیام "Light is turn on" در کنسول چاپ می شود. به طور مشابه، هنگامی که TurnOff فراخوانی می شود، TurnOffCommand را اجرا می کند که متد TurnOff را روی شی Light فراخوانی می کند و در نتیجه پیام "Light is turn off" در کنسول چاپ می شود.

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

برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همه‌ی الگو های طراحی می‌شود، برای شما قرار گرفته است.

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که می‌نویسم بدردتون بخوره.

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

در چشم انداز همیشه در حال تحول توسعه نرم افزار، معماری میکروسرویس ها به دلیل مقیاس پذیری، انعطاف پذیری و توسعه پذیری محبوبیت قابل توجهی به دست آورده است. با این حال، با افزایش تعداد میکروسرویس ها در یک برنامه، مدیریت ارتباطات آنها و اطمینان از رؤیت صحیح همه آنها به طور فزاینده ای چالش برانگیز می شود. اینجاست که سرویس مش وارد عمل می شود.

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه