"Halo, Amigo! Dina iki aku bakal ngandhani sawetara perkara sing menarik babagan kelas BufferedInputStream, nanging ayo miwiti karo « pambungkus » lan « tas gula ».

"Apa tegese "bungkus" lan "kantong gula"?"

"Iki metafora. Rungokake. Dadi..."

Pola desain «wrapper» (utawa «dekorator») minangka mekanisme sing cukup prasaja lan trep kanggo nambah fungsi obyek tanpa nggunakake warisan.

BufferedInputStream - 1

Upaminipun kita duwe kelas Cat kanthi rong cara: getName lan setName:

kode Jawa Katrangan
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;
 }
}
Kelas Cat duwe rong cara: getName lan 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());
}
Conto carane bisa digunakake.

«Oscar» bakal ditampilake ing console.

Upaminipun kita kudu nyegat telpon cara ing obyek kucing lan mbok menawa sawetara owah-owahan cilik. Kanggo iki, kita kudu mbungkus ing kelas pambungkus dhewe.

Yen kita pengin "bungkus" kode kita dhewe babagan cara nelpon ing sawetara obyek, mula kita kudu:

1) Nggawe kelas pambungkus dhewe lan warisan saka kelas / antarmuka sing padha karo obyek sing bakal dibungkus.

2) Pass obyek sing bakal kebungkus menyang konstruktor kelas kita.

3) Ganti kabeh cara ing kelas anyar kita. Nelpon metode obyek sing dibungkus ing saben metode sing ditindhes.

4) Gawe owah-owahan apa wae sing dikarepake: ganti apa sing diarani metode, ganti paramèter, lan/utawa tumindak liya.

Ing conto ing ngisor iki, kita nyegat telpon menyang metode getName obyek Cat lan rada ngganti nilai bali.

kode Jawa Katrangan
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;
 }
}
Kelas Cat ngemot rong cara: getName lan 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);
 }
}
Kelas bungkus. Kelas ora nyimpen data kajaba referensi kanggo obyek asli.
Kelas bisa "mbuwang" telpon kanggo obyek asli (setName) liwati kanggo konstruktor. Sampeyan uga bisa "nyekel" telpon iki lan ngowahi paramèter lan/utawa asil .
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());
}
Conto carane bisa digunakake.

"Kucing jenenge Oscar".
bakal ditampilake ing console

Ing tembung liyane, kita quietly ngganti saben obyek asli karo obyek wrapper, kang nampa link kanggo obyek asli. Kabeh cara telpon ing pambungkus diterusake menyang obyek asli, lan kabeh mlaku kaya clockwork.

"Aku seneng. Solusi iki prasaja lan fungsional."

"Aku uga bakal pitutur marang kowe babagan «tas gula». Iki minangka metafora tinimbang pola desain. Metafora kanggo tembung buffer lan buffering. Apa buffering lan kenapa kita butuh?"

BufferedInputStream - 2

Ayo ngomong yen dina iki giliran Rishi masak, lan sampeyan nulungi dheweke. Rishi durung teka, nanging aku pengin ngombe teh. Aku njaluk sampeyan nggawa kula sendok gula. Sampeyan menyang ruang paling ngisor lan golek tas gula. Sampeyan bisa nggawa kula kabeh tas, nanging aku ora butuh tas. Aku mung butuh siji sendok. Banjur, kaya robot sing apik, sampeyan njupuk siji sendok lan nggawa menyang aku. Aku nambahake ing teh, nanging isih ora cukup manis. Lan aku njaluk sampeyan nggawa aku siji maneh. Sampeyan maneh menyang ruang paling ngisor lan nggawa sendok liyane. Banjur Ellie teka, lan aku njaluk sampeyan nggawa gula kanggo dheweke ... Kabeh iki butuh wektu suwe lan ora efisien.

Rishi teka, ndeleng kabeh iki, lan njaluk sampeyan nggawa mangkuk gula sing kebak gula. Banjur aku lan Ellie njaluk gula marang Rishi. Dheweke mung ngladeni kita saka mangkuk gula, lan kabeh.

Apa sing kedadeyan sawise Rishi muncul diarani buffering : mangkuk gula minangka buffer. Thanks kanggo buffering, "klien" bisa maca data saka buffer ing bagean cilik , nalika buffer, supaya irit wektu lan gaweyan, maca saka sumber ing bagean gedhe .

"Iku conto sing apik, Kim. Aku ngerti kanthi sampurna. Panjaluk gula kanthi sendok kaya maca siji bait saka aliran."

"Persis. Kelas BufferedInputStream minangka conto klasik saka bungkus buffered. Iki mbungkus kelas InputStream. Iki maca data saka InputStream asli ing blok gedhe menyang buffer, lan banjur narik metu saka buffer Piece-by-piece nalika kita maca saka iku."

"Apik banget. Iku kabeh cetha. Apa ana buffer kanggo nulis?"

"Oh, mesthi."

"Mungkin conto?"

"Mbayangno tong sampah. Tinimbang metu kanggo nyelehake sampah menyang incinerator saben-saben, sampeyan mung mbuwang menyang tong sampah. Banjur Bubba njupuk kaleng ing njaba saben rong minggu. Buffer klasik."

"Carane menarik! Lan luwih cetha tinimbang tas gula, kanthi cara."

"Lan cara siram () kaya njupuk sampah langsung. Sampeyan bisa nggunakake sadurunge tamu teka."