البحث عن مثال لنمط الأوامر لواجهة المستخدم [مغلق]

StackOverflow https://stackoverflow.com/questions/15047

  •  08-06-2019
  •  | 
  •  

سؤال

أنا أعمل على تطبيق WinForm .Net مع واجهة المستخدم الأساسية التي تتضمن أزرار شريط الأدوات وعناصر القائمة وضغطات المفاتيح التي تبدأ جميعها نفس التعليمات البرمجية الأساسية.في الوقت الحالي، تستدعي معالجات الأحداث لكل منها طريقة شائعة لأداء الوظيفة.

مما قرأته يمكن التعامل مع هذا النوع من الإجراءات بواسطة نمط تصميم الأوامر مع ميزة إضافية تتمثل في تمكين/تعطيل أو التحقق/إلغاء تحديد عناصر واجهة المستخدم تلقائيًا.

لقد كنت أبحث في شبكة الإنترنت عن مشروع مثال جيد، ولكن في الحقيقة لم أجد واحدة.هل لدى أي شخص مثال جيد يمكن مشاركته؟

هل كانت مفيدة؟

المحلول

دعونا نتأكد أولاً من أننا نعرف ما هو نمط الأمر:

يلف نمط الأوامر طلبًا ككائن ويعطيه واجهة عامة معروفة.يضمن نمط الأوامر أن يتلقى كل كائن أوامره الخاصة ويوفر فصلًا مفصلاً بين المرسل والمستقبل.المرسل هو كائن يستدعي العملية ، والمستقبل هو كائن يتلقى الطلب ويتصرف عليه.

هنا مثال لك.هناك العديد من الطرق التي يمكنك من خلالها القيام بذلك، لكنني سأتبع نهجًا أساسيًا للواجهة لجعل الكود أكثر قابلية للاختبار بالنسبة لك.لست متأكدًا من اللغة التي تفضلها، لكنني أكتب هذا بلغة C#.

أولاً، قم بإنشاء واجهة تصف الأمر.

public interface ICommand
{
    void Execute();
}

ثانيًا، قم بإنشاء كائنات الأوامر التي ستقوم بتنفيذ واجهة الأوامر.

public class CutCommand : ICommand
{
    public void Execute()
    {
        // Put code you like to execute when the CutCommand.Execute method is called.
    }
}

ثالثًا، نحتاج إلى إعداد كائن المستدعي أو المرسل.

public class TextOperations
{
    public void Invoke(ICommand command)
    {
        command.Execute();
    }
}

رابعًا، قم بإنشاء كائن العميل الذي سيستخدم كائن المستدعي/المرسل.

public class Client
{
    static void Main()
    {
        TextOperations textOperations = new TextOperations();
        textOperation.Invoke(new CutCommand());
    }
}

أتمنى أن تأخذ هذا المثال وتضعه موضع الاستخدام للتطبيق الذي تعمل عليه.إذا كنت ترغب في مزيد من التوضيح، فقط اسمحوا لي أن أعرف.

نصائح أخرى

بك على الطريق الصحيح.في الأساس سيكون لديك نموذج يمثل المستند.سوف تستخدم هذا النموذج في ملف CutCommand.سوف تحتاج إلى تغيير مُنشئ CutCommand لقبول المعلومات التي تريد قصها.ثم في كل مرة، لنفترض أنه تم النقر على زر القطع، يمكنك استدعاء CutCommand جديد وتمرير الوسائط في المنشئ.ثم استخدم تلك الوسائط في الفصل عند استدعاء أسلوب التنفيذ.

جرب المصادر المفتوحة، مثل برامج تحرير .NET SharpDevelop أو المفكرة ++.

هناك (بطبيعة الحال) بعض المناقشات حول نمط الأوامر في http://c2.com/cgi/wiki?CommandPattern قد يكون ذلك مفيدًا.

يستخدم Qt نمط الأوامر لعناصر شريط القوائم/شريط الأدوات.

يتم إنشاء QActions بشكل منفصل من QMenuItem وQToolbar، ويمكن تعيين الإجراءات إلى QMenuItem وQToolbar باستخدام أسلوب setAction() وaddAction() على التوالي.

http://web.archive.org/web/20100801023349/http://cartan.cas.suffolk.edu/oopdocbook/html/menus.html

http://web.archive.org/web/20100729211835/http://cartan.cas.suffolk.edu/oopdocbook/html/actions.html

لا يمكنني مساعدتك برابط المثال، لكن يمكنني تقديم مثال بنفسي.

1) تحديد واجهة ICommand:

public interface ICommand {
   void Do();
   void Undo();
}

2) قم بتنفيذ تطبيقات ICommand الخاصة بك للأوامر الملموسة، ولكن قم أيضًا بتحديد فئة أساسية مجردة لها:

public abstract class WinFormCommand : ICommand {

}

3) إنشاء مستدعي الأوامر:

public interface ICommandInvoker {
  void Invoke(ICommand command);
  void ReDo();
  void UnDo();
}

public interface ICommandDirector {
  void Enable(ICommand);
  void Disable(ICommand);
}

public class WinFormsCommandInvoker : ICommandInvoker, ICommandDirector {

    private readonly Dictionary<ICommand, bool> _commands;
    private readonly Queue<ICommand> _commandsQueue;       
    private readonly IButtonDirector _buttonDirector;

    // you can define additional queue for support of ReDo operation

    public WinFormsCommandInvoker(ICommandsBuilder builder, IButtonDirector buttonDirector) {
      _commands = builder.Build();
      _buttonDirector = buttonDirector;
      _commandsQueue = new Queue<ICommand>();
    } 

    public void Invoke(ICommand command) {
        command.Do();
        __commandsQueue.Enqueue(command);
    }

    public void ReDo() {
      //you can implement this using additional queue
    }

    public void UnDo() {
      var command = __commandsQueue.Dequeue();
      command.Undo();
    }

    public void Enable(ICommand command) {
      _commands.[command] = true;
      _buttonDirector.Enable(command);
    }

    public void Disable(ICommand command) {
      _commands.[command] = false;
      _buttonDirector.Disable(command); 
    }
}

4) يمكنك الآن تنفيذ ICommandsBuilder وIButtonDirector وإضافة واجهات أخرى مثل ICheckBoxDirector إلى WinFormsCommandInvocer.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top