2012-03-30 17 views
6

में तत्काल दृश्य की उत्तरदायित्व एमवीपी आर्किटेक्चर के साथ आवेदन डिजाइन करते समय मैं तत्काल दृश्य के बारे में प्रश्न के साथ आया। मेरे मामले में प्रस्तुतकर्ता को UI टूलकिट के आसान परिवर्तन की संभावना के लिए पूरी तरह से अलग किया जाना चाहिए। जब तक केवल एक ही दृश्य है, सब कुछ स्पष्ट है। मेरी समस्या तब आती है जब विचारों को गतिशील रूप से बनाने की आवश्यकता होती है। उदाहरण के लिए जब नया बटन क्लिक किया जाता है तो संवाद पॉपअप उपयोगकर्ता को कुछ डेटा भरने के लिए कहता है। मैं दो समाधानों के साथ आता हूं लेकिन मैं दूसरों के बारे में उत्सुक हूं। मैं अपने दृष्टिकोण के नीचे नमूना कोड दे रहा हूं।एमवीपी

  1. आइए जनक दृश्य संवाद दृश्य का दृष्टांत और यह माता पिता के प्रस्तोता जहां संवाद प्रस्तोता भी दृष्टांत है पर लौटने के लिए। मुझे इस विचार को पसंद नहीं है कि ठोस दृश्य को एक और दृश्य को तुरंत चालू करना चाहिए। मुझे एहसास है कि तत्कालता देखने की ज़िम्मेदारी नहीं है।

    public interface View { 
        public void setPresenter(Presenter presenter); 
        public void showView(); 
    } 
    
    public interface NewDialogView implements View { 
        /* ommited ordinary getters/setters for view */ 
    } 
    
    public interface MainWindowView implements View { 
    
        /* ommited ordinary getters/setters for view */ 
    
        public NewDialogView createNewDialog(); 
    } 
    
    public interface Presenter { 
        public View getView(); 
    } 
    
    public class NewDialogPresenter implements Presenter { 
    
        protected NewDialogView view; 
    
        public MainWindow(NewDialogView view) { 
         this.view = view; 
         this.view.setPresenter(this); 
        } 
    
        public View getView() { 
        return view; 
        } 
    } 
    
    public class MainWindowPresenter implements Presenter { 
    
        protected MainWindowView view; 
    
        public MainWindow(MainWindowView view) { 
         this.view = view; 
         this.view.setPresenter(this); 
        } 
    
        public void newButtonClicked() { 
        NewDialogView newDialogView = view.createNewDialog(); // too much responsibility? 
        NewDialogPresenter newDialogPresenter = new NewDialogPresenter(newDialogView); 
        newDialogView.showView(); 
    
        /* then let's NewDialogPresenter deal with user input */ 
        } 
    
        public View getView() { 
        return view; 
        } 
    } 
    
  2. प्रस्तुतकर्ता को कारखाने इंजेक्ट करें। यह कारखाना तत्काल दृश्य के लिए ज़िम्मेदार है। संवाद दृश्य को पारित करने के लिए कुछ समस्या है (आमतौर पर जीयूआई ढांचे को इसकी आवश्यकता होती है)। इसके अलावा सेटअप की एक बड़ी मात्रा है।

    // Just presenter approach differs and there is no create method in view interface. 
    
    public interface MainWindowView implements View { 
        /* ommited ordinary getters/setters for view */ 
    } 
    
    public class MainWindowPresenter implements Presenter { 
    
        protected MainWindowView view; 
        protected NewDialogViewFactory newDialogViewFactory; 
    
        public MainWindow(MainWindowView view) { 
         this.view = view; 
         this.view.setPresenter(this); 
        } 
    
        public void newButtonClicked() { 
        NewDialogView newDialogView = newDialogViewFactory.createNewDialog(view); // should pass a parent view here or not? 
        NewDialogPresenter newDialogPresenter = new NewDialogPresenter(newDialogView); 
        newDialogView.showView(); 
        // then let's NewDialogPresenter deal with user input 
        } 
    
        public View getView() { 
        return view; 
        } 
    
        public void setNewDialogViewFactory(NewDialogViewFactory newDialogViewFactory) { 
        this.newDialogViewFactory = newDialogViewFactory; 
        } 
    } 
    

नए प्रस्तोता का दृष्टांत और देखने के लिए जिम्मेदारी के बारे में आपकी राय क्या है? मैं अन्य लोगों के दृष्टिकोण के व्यावहारिक उदाहरण की तलाश में हूं। आपके सुझावों के लिए धन्यवाद।

+0

[इस पोस्ट] [http://stackoverflow.com/questions/3309029/mvp-should-the-view-implement-a-Presenters-interface-or-vice-versa) देखें और देखें कि यह मदद करता है या नहीं। –

उत्तर

1

मेरे मामले में मैं वास्तव में कभी भी विचार नहीं बनाता (संवाद सहित)। मैं धारणा करता हूं कि किसी भी समय एक से अधिक संवाद मौजूद नहीं हो सकते हैं इसलिए मैं प्रस्तुति में संवाद को इंजेक्ट करने और इंजेक्ट करने के लिए GIN का उपयोग करता हूं। प्रस्तुतकर्ता को केवल संवाद (हैंडलर सहित) पर विशेषताओं को बदलने और इसे दिखाने की आवश्यकता है। यह मुझे जीआईएन का उपयोग कर एक ही स्थान पर सभी विचारों (और प्रस्तुतकर्ताओं) के निर्माण का प्रबंधन करने की अनुमति देता है।

+0

आपके उत्तर के लिए धन्यवाद। समस्या यह है कि विभिन्न यूआई पुस्तकालयों में अलग-अलग मेमोरी प्रबंधन होते हैं। इसलिए कभी-कभी संवाद बंद होने के बाद निपटान किया जाना चाहिए, कभी-कभी सिंगलटन की तरह कार्य करता है और बार-बार फिर से दिखाया जाता है। मैं प्रस्तुति तर्क से इसे अलग करना चाहता हूं। –

संबंधित मुद्दे