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. Kanthi 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. Upaminipun 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 singCardReader
kelas 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 babReader
lan Writer
kelas. Kenapa khusus kelas kasebut? Amarga ana hubungane karo bagean sadurunge babagan adaptor. Ayo padha nliti kanthi luwih rinci. Kita bakal miwiti karo Reader
. Reader
minangka kelas abstrak, mula kita ora bakal bisa nggawe obyek kanthi jelas. Nanging sampeyan pancen wis ngerti! Sawise kabeh, sampeyan wis kenal karo kelas BufferedReader
lan InputStreamReader
, yaiku turunane :)
public class BufferedReader extends Reader {
…
}
public class InputStreamReader extends Reader {
…
}
Kelas kasebut InputStreamReader
minangka adaptor klasik. Sampeyan bisa uga elinga, kita bisa ngirim InputStream
obyek menyang konstruktor. Kanggo nindakake iki, kita biasane nggunakake System.in
variabel:
public static void main(String[] args) {
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Nanging apa sing InputStreamReader
ditindakake? Kaya saben adaptor, ngowahi siji antarmuka menyang liyane. Ing kasus iki, InputStream
antarmuka kanggo Reader
antarmuka. Kaping pisanan, kita duwe InputStream
kelas. Kerjane apik, nanging sampeyan mung bisa nggunakake kanggo maca bait individu. Kajaba iku, kita duwe Reader
kelas 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
. Sakumpulan 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 Reader
kelas abstrak . Kita uga bisa ndeleng iki ing dokumentasi. Nanging, antarmuka InputStream
lan Reader
ora 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 MemoryCard
obyek nang CardReader
. Saiki kita ngirim InputStream
obyek menyang InputStreamReader
konstruktor! Kita nggunakake System.in
variabel 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. Lan sanajan System.in
obyek kita (stream sing kaiket ing keyboard) wiwitane ora ngidini, pangripta basa ngrampungake masalah iki kanthi ngetrapake pola adaptor. Kelas Reader
abstrak, 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 OutputStream
kelas sing mung bisa nulis bita, ana aWriter
kelas abstrak sing ngerti carane bisa karo karakter, lan ana loro antarmuka kompatibel. Masalah iki ditanggulangi maneh kanthi pola adaptor. Kita nggunakake OutputStreamWriter
kelas kanggo gampang adaptasi loro antarmuka Writer
lan OutputStream
kelas kanggo saben liyane. Sawise ngliwati OutputStream
stream byte menyang konstruktor, kita bisa nggunakake OutputStreamWriter
karakter 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! :)
GO TO FULL VERSION