2013-01-21 19 views
11

मैं समझता हूं कि State pattern उन वस्तुओं को मॉडल करने के लिए उपयोग किया जा सकता है जो राज्य और विभिन्न राज्यों के आधार पर व्यवहार को बदलते हैं जो ContextState इंटरफ़ेस का प्रतिनिधित्व करने वाले ठोस वर्गों में encapsulated हो सकता है। मैं स्पष्ट नहीं हूं कि इस पैटर्न में राज्य संक्रमण कैसे होते हैं। क्या व्यक्ति states जानते हैं और यह तय करते हैं कि उनका अनुसरण कौन करता है या यह Context है जो यह तय करता है कि यह कौन सा राज्य अगला होगा?राज्य पैटर्न में राज्य संक्रमण को कौन परिभाषित करता है?

उत्तर

9

GOF डिजाइन पैटर्न पुस्तक से (यह कार्यान्वयन अनुभाग में होती है):

1. राज्य संक्रमण कौन परिभाषित करता है? राज्य पैटर्न यह निर्दिष्ट नहीं करता कि कौन सा प्रतिभागी राज्य संक्रमण के मानदंड को परिभाषित करता है। यदि मानदंड तय किए जाते हैं, तो उन्हें पूरी तरह से संदर्भ में लागू किया जा सकता है। यह आमतौर पर अधिक लचीला और उचित होता है, हालांकि, राज्य के उप-वर्गों को स्वयं को उत्तराधिकारी राज्य निर्दिष्ट करने और संक्रमण कब करना है। इसके लिए संदर्भ में एक इंटरफ़ेस जोड़ने की आवश्यकता है जो राज्य ऑब्जेक्ट्स को संदर्भ के वर्तमान स्थिति को स्पष्ट रूप से सेट करने देता है।

इस तरह से संक्रमण तर्क को विकृत करने से नए राज्य उप-वर्गों को परिभाषित करके तर्क को संशोधित या विस्तार करना आसान हो जाता है। विकेंद्रीकरण का एक नुकसान यह है कि एक राज्य उप-वर्ग में कम से कम एक दूसरे का ज्ञान होगा, जो उप-वर्गों के बीच कार्यान्वयन निर्भरताओं को प्रस्तुत करता है।

4

एक अपेक्षाकृत ठोस उदाहरण स्पष्ट हो सकता है। मुझे उम्मीद है कि मैं इसे सही ढंग से समझ रहा हूं

मान लीजिए कि एक वाशिंग मशीन में दो राज्य हैं (चालू, बंद)। बाद GOF शब्दावली:

  • प्रसंग => washingmachine
  • राज्य => WashingMachineState
  • कंक्रीट राज्यों => StateOn, StateOff

राज्य संक्रमण के लिए, राज्य उपवर्गों के माध्यम से (हमारे मामले में StateOn और स्टेटऑफ) हमें राज्य संदर्भ बदलने के लिए एक विधि की आवश्यकता है:

class WashingMachine { 
    WashingMachineState state; 
    ... 
    protected void setState(WashingMachineState newState) { 
     state = newState; 
    } 

    someMethod() { 
     ... 
     state.pushStartButton(this); 
     ... 
    } 
} 
abstract class WashingMachineState { 
    protected void run(); 
    protected void pushStartButton(WashingMachine wm); 
} 
class StateOn extends WashingMachineState { 
    ... 
    void pushStartButton(WashingMachine wm) { 
     wm.setState(new StateOff()) 
    } 
} 

class StateOff extends WashingMachineState { 
    ... 
    void pushStartButton(WashingMachine wm) { 
     wm.setState(new StateOn()) 
    } 
} 

बस रखें ध्यान में रखते हुए इसे लागू करने के कई तरीके हैं, रचनात्मकता मदद करता है!

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