"हॅलो, अमिगो! आज मी तुम्हाला BufferedInputStream वर्गाबद्दल काही मनोरंजक गोष्टी सांगेन, परंतु चला « wrappers » आणि « साखरेची पिशवी » ने सुरुवात करूया."

"तुला «रॅपर» आणि «साखराची पिशवी» म्हणजे काय?

"हे रूपक आहेत. ऐका. तर..."

«रॅपर» (किंवा «डेकोरेटर») डिझाइन पॅटर्न हे इनहेरिटेन्स न वापरता ऑब्जेक्टची कार्यक्षमता वाढवण्याची एक सोपी आणि सोयीस्कर यंत्रणा आहे.

बफर्डइनपुटस्ट्रीम - १

समजा आपल्याकडे दोन पद्धतींचा कॅट क्लास आहे: 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) तुम्हाला हवे ते बदल करा: पद्धत कॉल करते ते बदला, त्यांचे पॅरामीटर्स बदला आणि/किंवा दुसरे काहीतरी करा.

खालील उदाहरणात, आम्ही कॅट ऑब्जेक्टच्या getName पद्धतीचे कॉल इंटरसेप्ट करतो आणि त्याचे रिटर्न व्हॅल्यू किंचित बदलतो.

जावा कोड वर्णन
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

समजा आज ऋषीची स्वयंपाक करण्याची पाळी आली आहे आणि तुम्ही त्याला मदत करत आहात. ऋषी अजून आलेला नाही, पण मला चहा प्यायचा आहे. मी तुला एक चमचा साखर आणायला सांगतो. तुम्ही तळघरात जा आणि साखरेची पिशवी शोधा. तुम्ही मला संपूर्ण बॅग आणू शकता, पण मला बॅगची गरज नाही. मला फक्त एक चमचा हवा आहे. मग, एखाद्या चांगल्या रोबोटप्रमाणे, तुम्ही एक चमचा घ्या आणि माझ्याकडे आणा. मी ते चहामध्ये जोडते, परंतु तरीही ते पुरेसे गोड नाही. आणि मी तुम्हाला आणखी एक आणण्यास सांगतो. तुम्ही पुन्हा तळघरात जा आणि आणखी एक चमचा घेऊन या. मग एली सोबत येते, आणि मी तुला तिच्यासाठी साखर आणण्यास सांगते... हे सर्व खूप वेळ घेते आणि ते अकार्यक्षम आहे.

ऋषी येतो, हे सर्व पाहतो, आणि तुम्हाला साखरेने भरलेला एक वाटी आणायला सांगतो. मग एली आणि मी ऋषीला साखर मागू लागलो. तो फक्त साखरेच्या भांड्यातून आम्हाला देतो आणि एवढेच.

ऋषी दिसल्यानंतर जे घडले त्याला बफरिंग म्हणतात : साखरेची वाटी बफर आहे. बफरिंगबद्दल धन्यवाद, "क्लायंट" बफरमधील डेटा लहान भागांमध्ये वाचू शकतात , तर बफर, वेळ आणि श्रम वाचवण्यासाठी, मोठ्या भागांमध्ये स्त्रोतांकडून वाचतो .

"हे एक मस्त उदाहरण आहे, किम. मला उत्तम प्रकारे समजले आहे. एक चमचा साखरेची विनंती म्हणजे प्रवाहाचा एक बाइट वाचण्यासारखे आहे."

"नक्कीच. बफर्ड इनपुटस्ट्रीम क्लास हे बफर केलेल्या रॅपरचे शास्त्रीय उदाहरण आहे. ते इनपुटस्ट्रीम क्लासला गुंडाळते. ते मूळ इनपुटस्ट्रीममधील डेटा मोठ्या ब्लॉक्समध्ये बफरमध्ये वाचते आणि नंतर बफरमधून तुकड्या-तुकड्यातून बाहेर काढते. त्यातून वाचा."

"खूप छान. हे सर्व स्पष्ट आहे. लिहिण्यासाठी बफर आहेत का?"

"हो जरूर."

"कदाचित उदाहरण?"

"कचऱ्याच्या डब्याची कल्पना करा. प्रत्येक वेळी कचरा पेटवायला बाहेर जाण्याऐवजी, तुम्ही तो कचरापेटीत टाका. मग बुब्बा दर दोन आठवड्यांनी एकदा डबा बाहेर काढतो. एक उत्कृष्ट बफर."

"किती इंटरेस्टिंग! आणि साखरेच्या पिशवीपेक्षा खूप क्लिअर, बाय द वे."

"आणि फ्लश() पद्धत लगेच कचरा बाहेर काढण्यासारखी आहे. पाहुणे येण्यापूर्वी तुम्ही ते वापरू शकता."