2008-08-18 21 views
13

के लिए कमांड पैटर्न का उदाहरण खोज रहे हैं मैं मूल UI के साथ WinForm .Net एप्लिकेशन पर काम कर रहा हूं जिसमें टूलबार बटन, मेनू आइटम और कीस्ट्रोक शामिल हैं जो सभी एक ही अंतर्निहित कोड शुरू करते हैं। अभी इनमें से प्रत्येक के लिए इवेंट हैंडलर फ़ंक्शन करने के लिए एक सामान्य विधि कॉल करते हैं।यूआई

जो मैंने पढ़ा है उससे Command design pattern द्वारा स्वचालित रूप से सक्षम/अक्षम करने या UI तत्वों को अनचेक करने के अतिरिक्त लाभ के साथ इस प्रकार की कार्रवाई को संभाला जा सकता है।

मैं एक अच्छी उदाहरण परियोजना के लिए नेट खोज रहा हूं, लेकिन वास्तव में एक नहीं मिला है। क्या किसी के पास एक अच्छा उदाहरण है जिसे साझा किया जा सकता है?

उत्तर

16

चलो पहले यकीन है कि हम जानते हैं कि कमान पैटर्न है:

कमान पैटर्न एक वस्तु के रूप में एक अनुरोध समाहित है और यह एक ज्ञात सार्वजनिक इंटरफ़ेस देता है। कमांड पैटर्न सुनिश्चित करता है कि प्रत्येक ऑब्जेक्ट को अपने आदेश प्राप्त होते हैं और प्रेषक और रिसीवर के बीच एक decoupling प्रदान करता है। एक प्रेषक एक ऑब्जेक्ट है जो ऑपरेशन को आमंत्रित करता है, और एक रिसीवर एक ऑब्जेक्ट है जो अनुरोध प्राप्त करता है और पर कार्य करता है।

यहां आपके लिए एक उदाहरण है। ऐसा करने के कई तरीके हैं जो आप कर सकते हैं, लेकिन मैं कोड को आपके लिए अधिक टेस्ट करने योग्य बनाने के लिए एक इंटरफेस बेस दृष्टिकोण लेने जा रहा हूं। मुझे यकीन नहीं है कि आप कौन सी भाषा पसंद करते हैं, लेकिन मैं इसे सी # में लिख रहा हूं।

सबसे पहले, एक कमांड का वर्णन करने वाला इंटरफ़ेस बनाएं।

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()); 
    } 
} 

मुझे आशा है कि आप यह उदाहरण ले सकते हैं और जिस एप्लिकेशन पर आप काम कर रहे हैं उसके लिए इसे उपयोग में डाल सकते हैं। यदि आप अधिक स्पष्टीकरण चाहते हैं, तो बस मुझे बताएं।

1

ओपन सोर्स, .NET संपादकों जैसे SharpDevelop या Notepad++ का प्रयास करें।

http://c2.com/cgi/wiki?CommandPattern पर कमांड पैटर्न की कुछ चर्चा (स्वाभाविक रूप से) है जो सहायक हो सकती है।

2

आपका सही ट्रैक पर। असल में आपके पास एक मॉडल होगा जो दस्तावेज़ का प्रतिनिधित्व करता है। आप CutCommand में इस मॉडल का उपयोग करेंगे। आप कट-कॉमांड के कन्स्ट्रक्टर को उस सूचना को स्वीकार करने के लिए बदलना चाहते हैं, जिसे आप कट करना चाहते हैं। फिर हर बार, कहें कि कट बटन क्लिक किया गया है, आप एक नया CutCommand का आह्वान करते हैं और कन्स्ट्रक्टर में तर्क पारित करते हैं। फिर निष्पादन विधि कहलाते समय कक्षा में उन तर्कों का उपयोग करें।

1

क्यूटी मेनूबार/टूलबार आइटम के लिए कमांड पैटर्न का उपयोग करता है।

QMenuItem और QToolbar से क्यूएक्शन अलग-अलग बनाए जाते हैं, और क्रियाएं क्रमशः setAction() और addAction() विधि के साथ QMenuItem और QToolbar को असाइन की जा सकती हैं।

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

+0

मुझे लगता है कि पोस्ट 4 साल पहले था, इसलिए यह समझाएगा। लेकिन दोनों लिंक अब टूटा हुआ है। –

+1

उनके archive.org प्रतिलिपि के लिंक के साथ टूटे हुए लिंक बदले गए – Imran

0

मैं उदाहरण के लिंक के साथ आपकी मदद नहीं कर सकता है, लेकिन अपने आप से उदाहरण दे सकता है।

1) को परिभाषित करें ICommand इंटरफ़ेस:

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

2) ठोस आदेश के लिए अपने ICommand कार्यान्वयन करते हैं, लेकिन यह भी उनके लिए सार आधार वर्ग को परिभाषित:

public abstract class WinFormCommand : ICommand { 

} 

3) आदेश invoker बनाएँ:

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) अब आप अपने आईसीओएमंड्सबिल्डर, आईबूटन डायरेक्ट को कार्यान्वित कर सकते हैं या WinFormsCommandInvoker में ICheckBoxDirector जैसे अन्य इंटरफेस जोड़ें।