CodeGym /Blog Jawa /Acak /Pola desain adaptor
John Squirrels
tingkat
San Francisco

Pola desain adaptor

Diterbitake ing grup
Hi! Dina iki kita bakal ndemek topik anyar sing penting: pola desain . Apa pola kasebut? Aku mikir sampeyan kudu ngerti ungkapan " ora reinvent setir ". Ing program, kaya ing wilayah liyane, ana akeh kahanan umum. Minangka pangembangan piranti lunak wis berkembang, solusi siap-digawe sing bisa digawe kanggo saben wong. Solusi kasebut diarani pola desain. Miturut konvensi, pola minangka solusi sing dirumusake kaya mangkene: "yen sampeyan kudu nindakake X ing program sampeyan, mula iki cara paling apik kanggo nindakake". Ana akeh pola. Buku sing apik banget "Pola Desain Kepala Pisanan", sing kudu sampeyan kenal, khusus kanggo dheweke. Pola desain adaptor - 2Kanthi ringkes, pola kalebu masalah umum lan solusi sing cocog sing bisa dianggep minangka standar. Ing wulangan dina iki, kita bakal nemokake salah sawijining pola kasebut: Adaptor. Iku jeneng ngandika kabeh, lan sampeyan wis ketemu adaptor kaping pirang-pirang ing urip nyata. Sawetara adaptor sing paling umum yaiku maca kertu sing duwe akeh komputer lan laptop. Pola desain adaptor - 3Upaminipun kita duwe sawetara jinis kertu memori. Dadi apa masalahe? Ora ngerti carane sesambungan karo komputer. Dheweke ora nuduhake antarmuka umum. Komputer wis port USB, nanging kita ora bisa masang kertu memori ing. Kertu kasebut ora bisa disambungake menyang komputer, mula kita ora bisa nyimpen foto, video, lan data liyane. A kertu maca adaptor sing solves masalah iki. Sawise kabeh, wis kabel USB! Ora kaya kertu dhewe, maca kertu bisa dipasang ing komputer. Padha nuduhake antarmuka umum karo komputer: USB. Ayo ndeleng carane iki katon ing laku:

public interface USB { 

   void connectWithUsbCable(); 
}
Iki antarmuka USB kita karo mung siji cara kanggo nyambungake liwat USB.

public class MemoryCard { 

   public void insert() { 
       System.out.println("Memory card successfully inserted!"); 
   } 

   public void copyData() { 
       System.out.println("The data has been copied to the computer!"); 
   } 
}
Iki kelas kita makili kertu memori. Wis 2 cara sing kita butuhake, nanging iki masalah: Ora ngetrapake antarmuka USB. Kertu ora bisa dilebokake menyang port USB.

public class CardReader implements USB { 

   private MemoryCard memoryCard; 

   public CardReader(MemoryCard memoryCard) { 
       this.memoryCard = memoryCard; 
   } 

   @Override 
   public void connectWithUsbCable() { 
       this.memoryCard.insert(); 
       this.memoryCard.copyData(); 
   } 
}
Lan iki adaptor kita! Apa singCardReaderkelas apa lan apa persis ndadekake adaptor? Kabeh iku prasaja. Kelas sing diadaptasi (MemoryCard) dadi salah sawijining lapangan adaptor. Iki ndadekake pangertèn. Nalika kita sijine kertu memori ing maca kertu ing urip nyata, iku uga dadi bagéan saka iku. Ora kaya kertu memori, adaptor nuduhake antarmuka karo komputer. Nduweni kabel USB, yaiku bisa disambungake menyang piranti liya liwat USB. Pramila kelas CardReader kita ngetrapake antarmuka USB. Nanging apa sing kedadeyan ing metode iki? Persis apa sing kudu kita lakoni! Adaptor delegasi karya menyang kertu memori kita. Pancen, adaptor ora nindakake apa-apa dhewe. A maca kertu ora duwe fungsi sawijining. Tugase mung nyambungake komputer lan kertu memori supaya kertu bisa nindakake tugase - nyalin file!connectWithUsbCable()cara) kanggo nyukupi "kabutuhan" kertu memori. Ayo nggawe sawetara program klien sing bakal simulasi wong sing pengin nyalin data saka kertu memori:

public class Main { 

   public static void main(String[] args) { 

       USB cardReader = new CardReader(new MemoryCard()); 
       cardReader.connectWithUsbCable(); 
   } 
}
Dadi apa sing kita entuk? Output konsol:

Memory card successfully inserted! 
The data has been copied to the computer!
Banget. Kita entuk tujuane! Iki link menyang video kanthi informasi babagan pola Adaptor:

Kelas abstrak Reader lan Writer

Saiki kita bakal bali menyang kegiatan favorit: sinau babagan sawetara kelas anyar kanggo nggarap input lan output :) Aku wonder carane akeh kita wis sinau bab. Dina iki kita bakal pirembagan bab Reader lan Writerkelas. Kenapa khusus kelas kasebut? Amarga ana hubungane karo bagean sadurunge babagan adaptor. Ayo padha nliti kanthi luwih rinci. Kita bakal miwiti karo  Reader. Readerminangka kelas abstrak, mula kita ora bakal bisa nggawe obyek kanthi jelas.   Nanging sampeyan pancen wis ngerti! Sawise kabeh, sampeyan wis kenal karo kelas BufferedReaderlan InputStreamReader, yaiku turunane :)

public class BufferedReader extends Reader { 
… 
} 

public class InputStreamReader extends Reader { 
… 
}
Kelas kasebut InputStreamReaderminangka adaptor klasik. Sampeyan bisa uga elinga, kita bisa ngirim InputStreamobyek menyang konstruktor. Kanggo nindakake iki, kita biasane nggunakake System.invariabel:

public static void main(String[] args) { 

   InputStreamReader inputStreamReader = new InputStreamReader(System.in); 
}
Nanging apa sing InputStreamReaderditindakake? Kaya saben adaptor, ngowahi siji antarmuka menyang liyane.  Ing kasus iki, InputStreamantarmuka kanggo Readerantarmuka. Kaping pisanan, kita duwe InputStreamkelas. Kerjane apik, nanging sampeyan mung bisa nggunakake kanggo maca bait individu. Kajaba iku, kita duwe Readerkelas abstrak. Nduwe sawetara fungsi sing migunani - ngerti carane maca karakter! Kita mesthi mbutuhake kemampuan iki. Nanging ing kene kita ngadhepi masalah klasik sing biasane ditanggulangi dening adaptor - antarmuka sing ora kompatibel. Apa tegese? Ayo goleki dokumentasi Oracle. Punika cara kelas InputStream. Pola desain adaptor - 4Sakumpulan metode persis apa antarmuka. Nalika sampeyan bisa ndeleng, kelas iki duwe aread()cara (sawetara varian, nyatane), nanging mung bisa maca bita: salah siji bait individu, utawa sawetara bait nggunakake buffer. Nanging pilihan iki ora cocog karo kita — kita pengin maca karakter. Kita butuh fungsi sing wis ditindakake ing Readerkelas abstrak . Kita uga bisa ndeleng iki ing dokumentasi. Pola desain adaptor - 5Nanging, antarmuka InputStreamlan  Readerora kompatibel! Kaya sing sampeyan ngerteni, saben implementasine metode kasebut read()duwe paramèter sing beda lan nilai bali. Lan iki ngendi kita kudu InputStreamReader! Iku bakal tumindak minangka adaptor antarane kelas kita. Kaya ing conto karo maca kertu, kang kita dianggep ndhuwur, kita sijine Kayata saka kelas dicocogake "nang" kelas adaptor, IE kita pass siji kanggo konstruktor sawijining. Ing conto sadurunge, kita sijine MemoryCardobyek nang CardReader. Saiki kita ngirim InputStream obyek menyang InputStreamReaderkonstruktor! Kita nggunakake System.invariabel akrab minangka InputStream:

public static void main(String[] args) { 

   InputStreamReader inputStreamReader = new InputStreamReader(System.in); 
}
Lan tenan, looking ing dokumentasi kanggo InputStreamReader, kita bisa ndeleng sing adaptasi kasil :) Saiki kita duwe cara kanggo maca karakter ing pembuangan kita. Pola desain adaptor - 6Lan sanajan System.inobyek kita (stream sing kaiket ing keyboard) wiwitane ora ngidini, pangripta basa ngrampungake masalah iki kanthi ngetrapake pola adaptor. Kelas Readerabstrak, kaya umume kelas I / O, duwe sedulur kembar -  Writer. Nduwe kauntungan gedhe sing padha karo  Reader - nyedhiyakake antarmuka sing trep kanggo nggarap karakter. Kanthi aliran output, masalah lan solusi katon padha karo aliran input. Ana OutputStreamkelas sing mung bisa nulis bita, ana aWriterkelas abstrak sing ngerti carane bisa karo karakter, lan ana loro antarmuka kompatibel. Masalah iki ditanggulangi maneh kanthi pola adaptor. Kita nggunakake OutputStreamWriterkelas kanggo gampang adaptasi loro antarmuka Writer lan  OutputStream kelas kanggo saben liyane. Sawise ngliwati OutputStreamstream byte menyang konstruktor, kita bisa nggunakake OutputStreamWriterkarakter nulis tinimbang bita!

import java.io.*; 

public class Main { 

   public static void main(String[] args) throws IOException { 

       OutputStreamWriter streamWriter = new OutputStreamWriter(new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt")); 
       streamWriter.write(32144); 
       streamWriter.close();
   } 
}
Kita nulis karakter kasebut kanthi kode 32144 (綐) menyang file kita, ngilangi kebutuhan kanggo nggarap bita :) Sing saiki. Ditemokake ing wulangan sabanjure! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION