"हैलो, अमीगो! आज मैं आपको BufferedInputStream क्लास के बारे में कुछ दिलचस्प बातें बताऊंगा, लेकिन चलिए « रैपर » और « चीनी का बैग » से शुरू करते हैं।"

"आवरण" और "चीनी का थैला" से आपका क्या मतलब है?"

"ये रूपक हैं। सुनो। तो ..."

«आवरण» (या «डेकोरेटर») डिजाइन पैटर्न वंशानुक्रम का उपयोग किए बिना वस्तु की कार्यक्षमता बढ़ाने के लिए एक काफी सरल और सुविधाजनक तंत्र है।

बफ़रेड इनपुटस्ट्रीम - 1

मान लीजिए कि हमारे पास दो विधियों के साथ कैट क्लास है: getName और setName:

जावा कोड विवरण
class Cat
{
 private String name;
 public Cat(String name)
 {
  this.name = name;
 }
 public String getName()
 {
  return this.name;
 }
 public void setName(String name)
 {
  this.name = name;
 }
}
कैट क्लास के दो तरीके हैं: getName और setName
public static void main(String[] args)
{
 Cat cat = new Cat("Oscar");

 printName(cat);
}

public static void printName(Cat cat)
{
 System.out.println(cat.getName());
}
इसका उपयोग कैसे किया जा सकता है इसका एक उदाहरण।

«ऑस्कर» कंसोल पर प्रदर्शित किया जाएगा।

मान लीजिए कि हमें कैट ऑब्जेक्ट पर एक मेथड कॉल को इंटरसेप्ट करने की जरूरत है और शायद कुछ छोटे बदलाव करें। इसके लिए, हमें इसे अपने रैपर वर्ग में लपेटने की जरूरत है।

अगर हम किसी ऑब्जेक्ट पर विधि कॉल के चारों ओर अपना कोड "लपेटना" चाहते हैं, तो हमें इसकी आवश्यकता है:

1) अपना खुद का रैपर वर्ग बनाएं और उसी वर्ग/इंटरफ़ेस से ऑब्जेक्ट को लपेटने के लिए प्राप्त करें।

2) ऑब्जेक्ट को हमारे वर्ग के कन्स्ट्रक्टर में लपेटने के लिए पास करें।

3) हमारी नई कक्षा में सभी विधियों को ओवरराइड करें। लपेटे गए ऑब्जेक्ट के तरीकों को ओवरराइड किए गए तरीकों में से प्रत्येक के अंदर आमंत्रित करें।

4) जो भी बदलाव आप चाहते हैं उसे करें: विधि कॉल क्या करती है उसे बदलें, उनके पैरामीटर बदलें, और/या कुछ और करें।

नीचे दिए गए उदाहरण में, हम कैट ऑब्जेक्ट के गेटनेम मेथड में कॉल्स को इंटरसेप्ट करते हैं और इसके रिटर्न वैल्यू को थोड़ा बदल देते हैं।

जावा कोड विवरण
class Cat
{
 private String name;
 public Cat(String name)
 {
  this.name = name;
 }
 public String getName()
 {
  return this.name;
 }
 public void setName(String name)
 {
  this.name = name;
 }
}
कैट क्लास में दो विधियाँ होती हैं: getName और setName।
class CatWrapper extends Cat
{
 private Cat original;
 public CatWrapper (Cat cat)
 {
  super(cat.getName());
  this.original = cat;
 }

 public String getName()
 {
  return "A cat named " + original.getName();
 }

 public void setName(String name)
 {
  original.setName(name);
 }
}
रैपर वर्ग। मूल वस्तु के संदर्भ को छोड़कर वर्ग कोई डेटा संग्रहीत नहीं करता है।
क्लास कन्स्ट्रक्टर को पास की गई मूल वस्तु (सेटनाम) को कॉल "फेंकने" में सक्षम है। यह इन कॉलों को "पकड़" भी सकता है और उनके मापदंडों और/या परिणामों को संशोधित कर सकता है
public static void main(String[] args)
{
 Cat cat = new Cat("Oscar");
 Cat catWrap = new CatWrapper (cat);
 printName(catWrap);
}

public static void printName(Cat named)
{
 System.out.println(named.getName());
}
इसका उपयोग कैसे किया जा सकता है इसका एक उदाहरण।

"ऑस्कर नाम की एक बिल्ली"।
कंसोल पर प्रदर्शित किया जाएगा

दूसरे शब्दों में, हम चुपचाप प्रत्येक मूल वस्तु को एक आवरण वस्तु से बदल देते हैं, जो मूल वस्तु का लिंक प्राप्त करती है। रैपर पर सभी विधि कॉल मूल वस्तु को अग्रेषित की जाती हैं, और सब कुछ घड़ी की कल की तरह चलता है।

"मुझे यह पसंद है। समाधान सरल और कार्यात्मक है।"

"मैं आपको «चीनी के बैग» के बारे में भी बताऊंगा। यह एक डिजाइन पैटर्न के बजाय एक रूपक है। बफर और बफरिंग शब्द के लिए एक रूपक। बफरिंग क्या है और हमें इसकी आवश्यकता क्यों है?"

बफ़रेडइनपुटस्ट्रीम - 2

मान लीजिए कि आज खाना बनाने की बारी ऋषि की है और आप उसकी मदद कर रहे हैं। ऋषि अभी यहां नहीं हैं, लेकिन मुझे चाय पीने की इच्छा है। मैं आपसे एक चम्मच चीनी लाने के लिए कहता हूं। आप तहखाने में जाते हैं और चीनी का एक थैला पाते हैं। आप मेरे लिए पूरा बैग ला सकते हैं, लेकिन मुझे बैग की जरूरत नहीं है। मुझे केवल एक चम्मच चाहिए। फिर एक अच्छे रोबोट की तरह आप एक चम्मच लेकर मेरे पास ले आइए। मैं इसे चाय में जोड़ता हूं, लेकिन यह अभी भी पर्याप्त मीठा नहीं है। और मैं आपसे एक और लाने के लिए कहता हूं। तुम फिर तलघर में जाओ और दूसरा चम्मच ले आओ। फिर ऐली साथ आती है, और मैं आपसे उसके लिए चीनी लाने के लिए कहता हूं... यह सब बहुत लंबा समय लेता है और अक्षम है।

ऋषि आता है, यह सब देखता है, और आपको चीनी से भरा चीनी का कटोरा लाने के लिए कहता है। फिर एली और मैं ऋषि से चीनी माँगने लगते हैं। वह बस हमें चीनी के कटोरे से परोसता है, और बस इतना ही।

ऋषि के आने के बाद जो हुआ उसे बफ़रिंग कहते हैं : चीनी का कटोरा एक बफ़र है। बफ़रिंग के लिए धन्यवाद, "ग्राहक" छोटे भागों में बफ़र से डेटा पढ़ सकते हैं , जबकि बफ़र, समय और प्रयास बचाने के लिए, उन्हें बड़े हिस्से में स्रोत से पढ़ता है ।

"किम, यह एक अच्छा उदाहरण है। मैं पूरी तरह से समझता हूं। एक चम्मच चीनी के लिए अनुरोध एक धारा से एक बाइट पढ़ने जैसा है।"

"बिल्कुल सही। BufferedInputStream क्लास बफ़र्ड रैपर का एक शास्त्रीय उदाहरण है। यह InputStream क्लास को लपेटता है। यह मूल InputStream से डेटा को बड़े ब्लॉक में एक बफर में पढ़ता है, और फिर इसे बफर पीस-बाय-पीस से बाहर निकालता है जैसा कि हम इससे पढ़ें।"

"बहुत अच्छा। यह सब स्पष्ट है। क्या लिखने के लिए बफर हैं?"

"ओह यकीनन।"

"शायद एक उदाहरण?"

"कचरे के डिब्बे की कल्पना करें। हर बार कचरे को जलाने के लिए बाहर जाने के बजाय, आप इसे कूड़ेदान में फेंक दें। फिर बुब्बा हर दो सप्ताह में एक बार डिब्बे को बाहर ले जाते हैं। एक क्लासिक बफर।"

"कितना दिलचस्प है! और चीनी के एक बैग की तुलना में बहुत अधिक स्पष्ट है।"

"और फ्लश () विधि तुरंत कचरा बाहर निकालने की तरह है। मेहमानों के आने से पहले आप इसका इस्तेमाल कर सकते हैं।"