1.1 تعریف و مفهوم
الگوی دستور یک الگوی طراحی رفتاری است که امکان کپسولهسازی یک درخواست به عنوان یک شیء را فراهم میکند، به نحوی که شما میتوانید مشتری را با درخواستهای مختلف پارامتریزه کنید.
1.2 هدف الگوی دستور
هدف اصلی الگوی دستور، جداسازی فرستنده و گیرنده است. با کپسولهسازی درخواست به یک شیء، فرستنده تنها نیاز دارد با شیء دستور تعامل کند، بدون تعامل مستقیم با گیرنده.
2. ویژگیها و مزایای الگوی دستور
الگوی دستور ویژگیها و مزایای زیر را دارد:
- کپسولهسازی درخواست به یک شیء فرستنده و گیرنده را جدا میکند.
- میتواند درخواستها را در صف قرار دهد، لاگها را ثبت کند و عملیات لغو را انجام دهد.
- دستورات جدید میتوانند بدون تغییر در کد اصلی گسترش یابند.
3. نمونههای کاربردی از الگوی دستور
الگوی دستور در صورتهای زیر قابل استفاده است:
- نیاز به جداسازی درخواست از شیء اجرای دستور.
- پشتیبانی از عملیات لغو و انجام مجدد.
- اجرای مجموعهای از عملیات به صورت مرتب در یک صف.
4.1 نمودار کلاس UML
4.2 معرفی نمونه
در این مثال، یک پیادهسازی ساده از الگوی دستور ایجاد خواهیم کرد. فرض کنید یک تلویزیون به عنوان گیرنده داریم که قادر به انجام عملیات روشن و خاموش است. همچنین یک کنترلکننده از نوع دعوتکننده داریم که میتواند دستورات خاصی را تعیین کرده و اجرا کند.
4.3.1 تعریف رابط دستور
type ICommand interface {
Execute()
}
4.3.2 پیادهسازی کلاس دستور محسوس
type ConcreteCommand struct {
receiver IReceiver
}
func (c *ConcreteCommand) Execute() {
c.receiver.Action()
}
4.3.3 تعریف رابط گیرنده
type IReceiver interface {
Action()
}
4.3.4 پیادهسازی کلاس گیرنده محسوس
type Receiver struct {}
func (r *Receiver) Action() {
fmt.Println("انجام عملیات")
}
4.3.5 پیادهسازی نقش دعوتکننده
type Invoker struct {
command ICommand
}
func (i *Invoker) SetCommand(command ICommand) {
i.command = command
}
func (i *Invoker) ExecuteCommand() {
i.command.Execute()
}
4.3.6 نمونه کد مشتری
func main() {
receiver := &Receiver{}
command := &ConcreteCommand{receiver: receiver}
invoker := &Invoker{}
invoker.SetCommand(command)
invoker.ExecuteCommand()
}
5. تفاوت بین الگوی دستور و الگوی استراتژی
الگوی دستور و الگوی استراتژی تا حدی مشابه هستند، زیرا هر دو رفتارهای خاصی را به شیء کپسوله میکنند. تفاوت در این است که الگوی دستور اصلی برای کپسولهسازی درخواستها به عنوان شیء و اجرای عملیاتی مانند لغو و صف اجرا استفاده میشود، در حالی که الگوی استراتژی اصلی برای کپسولهسازی مجموعهای از الگوریتمها و انتخاب دینامیک یک الگوریتم برای اجرا در زمان اجرا استفاده میشود.
الگوی دستور بیشتر برای عملیات مانند ثبت نمودار و حسابداری مناسب است، در حالی که الگوی استراتژی بیشتر برای تغییرات انعطافپذیر در منطق تجاری مناسب است.