जावा में उन्नत डिज़ाइन पैटर्न: सिद्धांत से जटिल उदाहरणों तक
डिज़ाइन पैटर्न सॉफ्टवेयर विकास के दौरान उत्पन्न होने वाली सामान्य समस्याओं के सिद्ध समाधान हैं। यदि बुनियादी पैटर्न (Singleton, Factory, Observer) अधिकांश जावा डेवलपर्स से परिचित हैं, तो उन्नत पैटर्न के लिए आर्किटेक्चर की गहरी समझ और जटिल व्यावसायिक परिदृश्यों में उन्हें लागू करने की क्षमता की आवश्यकता होती है। इस लेख में, हम तीन शक्तिशाली पैटर्न का विश्लेषण करेंगे: Visitor, Command और State — जावा में वास्तविक उदाहरणों के साथ, जो आपको अधिक लचीला और रखरखाव योग्य कोड लिखने में मदद करेंगे।
1. Visitor पैटर्न: डेटा संरचना से एल्गोरिदम को अलग करना
उद्देश्य: विभिन्न वर्गों की वस्तुओं के लिए नए ऑपरेशन जोड़ने की अनुमति देता है, बिना वर्गों को स्वयं बदले। जटिल पदानुक्रमों के साथ काम करने के लिए आदर्श, जहाँ वस्तु के प्रकार के आधार पर विभिन्न क्रियाएँ करने की आवश्यकता होती है।
समस्या: एक दस्तावेज़ प्रबंधन प्रणाली की कल्पना करें जिसमें TextDocument, ImageDocument और SpreadsheetDocument वर्ग हैं। आपको PDF, HTML और TXT में निर्यात लागू करना होगा। Visitor के बिना, प्रत्येक नए निर्यात प्रारूप के लिए सभी दस्तावेज़ वर्गों में बदलाव की आवश्यकता होगी।
Visitor के साथ समाधान:
// 1. तत्व (दस्तावेज़) का इंटरफ़ेसinterface DocumentElement { void accept(DocumentVisitor visitor);}
// 2. ठोस तत्वclass TextDocument implements DocumentElement { private String content; public TextDocument(String content) { this.content = content; } public String getContent() { return content; } @Override public void accept(DocumentVisitor visitor) { visitor.visit(this); }}
class ImageDocument implements DocumentElement { private byte[] imageData; public ImageDocument(byte[] data) { this.imageData = data; } public byte[] getImageData() { return imageData; } @Override public void accept(DocumentVisitor visitor) { visitor.visit(this); }}
// 3. विज़िटर का इंटरफ़ेसinterface DocumentVisitor { void visit(TextDocument doc); void visit(ImageDocument doc); void visit(SpreadsheetDocument doc);}
// 4. ठोस विज़िटर — HTML में निर्यातclass HtmlExporter implements DocumentVisitor { private StringBuilder sb = new StringBuilder(); @Override public void visit(TextDocument doc) { sb.append("<html><body><p>") .append(doc.getContent()) .append("</p></body></html>"); } @Override public void visit(ImageDocument doc) { sb.append("<html><body><img src='data:image/png;base64,") .append(Base64.getEncoder().encodeToString(doc.getImageData())) .append("'/></body></html>"); } @Override public void visit(SpreadsheetDocument doc) { sb.append("<html><body><table>...</table></body></html>"); } public String getResult() { return sb.toString(); }}
// 5. क्लाइंट कोडpublic class DocumentSystem { public static void main(String[] args) { List<DocumentElement> documents = Arrays.asList( new TextDocument("Hello World"), new ImageDocument(new byte[]{1,2,3}) ); HtmlExporter exporter = new HtmlExporter(); for (DocumentElement doc : documents) { doc.accept(exporter); } System.out.println(exporter.getResult()); }}मुख्य लाभ: एक नया प्रारूप (जैसे, JSON) जोड़ने के लिए, बस एक नया वर्ग JsonExporter implements DocumentVisitor बनाना पर्याप्त है — दस्तावेज़ वर्गों में से कोई भी नहीं बदलता है।