JavaRush /Blog Jawa /Random-JV /Adaptor Pola Desain

Adaptor Pola Desain

Diterbitake ing grup
Hello! Dina iki kita bakal ndemek topik anyar sing penting - pola, utawa kanthi tembung liyane - pola desain . Apa pola? Aku mikir sampeyan ngerti ungkapan "aja reinvent setir." Ing program, kaya ing akeh wilayah liyane, ana akeh kahanan khas. Kanggo saben wong, ing proses pangembangan program, solusi kerja sing wis siap digawe. Iki minangka pola desain. Sacara relatif, pola minangka conto tartamtu sing menehi solusi kanggo kahanan kaya: "yen program sampeyan kudu nindakake, kepiye cara sing paling apik." Ana akeh pola, buku sing apik banget "Sinau Pola Desain" khusus kanggo wong-wong mau, sing kudu diwaca. Pola desain "Adaptor" - 2Kanggo nyelehake kanthi sedhela, pola kasebut kalebu masalah umum lan solusi, sing bisa dianggep minangka standar. Ing kuliah dina iki kita bakal kenal karo salah sawijining pola sing diarani "Adaptor". Jenenge ngandhani, lan sampeyan wis nemokake adaptor ing urip nyata luwih saka sepisan. Salah sijine adaptor sing paling umum yaiku pembaca kertu, sing dilengkapi akeh komputer lan laptop. Pola desain adaptor - 3Mbayangno sing kita duwe sawetara jinis kertu memori. Apa masalahe? Kasunyatane dheweke ora ngerti carane sesambungan karo komputer. Dheweke ora duwe antarmuka umum. Komputer wis konektor USB, nanging sampeyan ora bisa masang kertu memori menyang. Kertu kasebut ora bisa dilebokake ing komputer, amarga kita ora bisa nyimpen foto, video lan data liyane. Pembaca kertu minangka adaptor sing bisa ngatasi masalah iki. Sawise kabeh, wis kabel USB! Ora kaya kertu dhewe, maca kertu bisa dilebokake ing komputer. Padha duwe antarmuka umum karo komputer - USB. Ayo ndeleng apa sing bakal katon karo conto:
public interface USB {

   void connectWithUsbCable();
}
Iki antarmuka USB kita kanthi cara mung kanggo masang kabel USB:
public class MemoryCard {

   public void insert() {
       System.out.println("Карта памяти успешно вставлена!");
   }

   public void copyData() {
       System.out.println("Данные скопированы на компьютер!");
   }
}
Iki kelas kita sing ngleksanakake peta memori. Wis 2 cara kita kudu, nanging iki masalah: ora ngleksanakake antarmuka USB. Kertu ora bisa dilebokake menyang slot 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 kelasCardReader apa lan apa iku adaptor? Iku prasaja. Kelas sing diadaptasi (peta memori) dadi salah sawijining lapangan adaptor. Iki logis, amarga ing urip nyata kita uga masang kertu ing maca kertu, lan uga dadi bagéan saka iku. Ora kaya kertu memori, adaptor nduweni antarmuka umum karo komputer. Wis kabel USB, tegese bisa nyambung menyang piranti liyane liwat USB. Mulane, ing program, kelas kita CardReadernindakake antarmuka USB. Nanging apa sing kedadeyan ing metode iki? Lan ana kedadeyan persis apa sing kita butuhake! Adaptor delegasi karya menyang kertu memori kita. Sawise kabeh, adaptor dhewe ora nindakake apa-apa, maca kertu ora duwe fungsi independen. Tugase mung nyambungake komputer lan kertu memori supaya kertu bisa nindakake tugas lan nyalin file! Adaptor kita ngidini nindakake iki kanthi nyedhiyakake antarmuka (metode connectWithUsbCable()) dhewe kanggo "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();

   }
}
Apa sing kita entuk minangka asil? Output konsol:
Карта памяти успешно вставлена!
Данные скопированы на компьютер!
Apik, tugas kita wis rampung kanthi sukses! Ing ngisor iki sawetara pranala tambahan kanthi informasi babagan pola Adaptor:

Kelas Abstrak Reader lan Writer

Saiki kita bakal bali menyang pastime favorit: kita bakal sinau saperangan saka kelas anyar kanggo nggarap input lan output :) Carane akeh wong wis kita wis sinau, Aku wonder? Dina iki kita bakal ngomong babagan kelas Readerlan Writer. Apa bab wong-wong mau? Amarga iki bakal ana gandhengane karo bagean sadurunge - adaptor. Ayo padha ndeleng ing liyane rinci. Ayo miwiti karo Reader'a. Readerminangka kelas abstrak, mula kita ora bakal bisa nggawe obyek kasebut kanthi jelas. Nanging nyatane sampeyan wis ngerti dheweke! Sawise kabeh, kelas sing sampeyan kenal BufferedReaderyaiku InputStreamReaderahli waris :)
public class BufferedReader extends Reader {}

public class InputStreamReader extends Reader {}
Dadi, kelas InputStreamReaderminangka adaptor klasik . Sampeyan bisa uga elinga, kita bisa ngirim obyek menyang konstruktor InputStream. Paling asring kita nggunakake variabel kanggo iki System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Apa sing ditindakake InputStreamReader? Kaya adaptor, ngowahi siji antarmuka menyang liyane. Ing kasus iki, antarmuka InputStream'a kanggo antarmuka Reader' a. Awale kita sekelas InputStream. Kerjane apik, nanging mung bisa maca bait individu. Kajaba iku, kita duwe kelas abstrak Reader. Nduwe fungsi sing apik banget sing kita butuhake - bisa maca karakter! Kita, mesthi, butuh kesempatan iki. Nanging ing kene kita ngadhepi masalah klasik sing biasane diatasi dening adaptor - ora kompatibel karo antarmuka. Kepriye wujude? Ayo ndeleng langsung menyang dokumentasi Oracle. Punika cara kelas InputStream. Pola desain "Adaptor" - 4Sakumpulan metode yaiku antarmuka. Nalika sampeyan bisa ndeleng, read()kelas iki nduweni cara (malah ing sawetara versi), nanging mung bisa maca bita: bait individu, utawa sawetara bait nggunakake buffer. Opsi iki ora cocog karo kita - kita pengin maca karakter. Fungsi sing kita butuhake wis ditindakake ing kelas abstrakReader . Iki uga bisa dideleng ing dokumentasi. Pola desain adaptor - 5Nanging, antarmuka InputStream'a' lan Reader'a' ora kompatibel! Kaya sing sampeyan ngerteni, ing kabeh implementasi metode, read()paramèter sing dilewati lan nilai bali beda-beda. Lan ing kene kita butuh InputStreamReader! Dheweke bakal tumindak minangka Adaptor antarane kelas kita. Kaya ing conto karo maca kertu, sing kita deleng ing ndhuwur, kita ngliwati obyek kelas "dicocogake" "internal", yaiku, menyang konstruktor kelas adaptor. Ing conto sadurunge, kita ngliwati obyek MemoryCarding njero CardReader. Saiki kita ngirim obyek InputStreammenyang konstruktor InputStreamReader! Minangka kualitas, InputStreamkita nggunakake variabel sing wis dikenal System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Lan pancen: kanthi ndeleng dokumentasi, InputStreamReaderkita bakal weruh yen "adaptasi" sukses :) Saiki kita duwe metode pembuangan sing ngidini kita maca karakter. Pola desain adaptor - 6Lan sanajan ing wiwitan obyek kita System.in(utas sing kaiket ing keyboard) ora ngidini, kanthi nggawe pola Adaptor , para pangripta basa ngrampungake masalah iki. Kelas abstrak Reader, kaya umume kelas I/O, duwe sedulur kembar - Writer. Nduwe kauntungan gedhe sing padha Reader- nyedhiyakake antarmuka sing trep kanggo nggarap simbol. Kanthi aliran output, masalah lan solusi katon padha karo aliran input. Ana kelas OutputStreamsing mung bisa nulis bita; Ana kelas abstrak Writersing bisa digunakake karo simbol, lan ana loro antarmuka sing ora kompatibel. Masalah iki maneh kasil ditanggulangi dening pola Adaptor. Nggunakake kelas, OutputStreamWriterkita bisa gampang "nyesuekake" loro antarmuka kelas Writerkanggo OutputStreamsaben liyane. Na, sawise nampa stream byte OutputStreaming konstruktor, kanthi bantuan OutputStreamWriterkita bisa, Nanging, nulis karakter, ora 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 kanthi kode 32144 - 綐 menyang file kita, saéngga ngilangi kebutuhan kanggo nggarap bita :) Sing kabeh kanggo dina iki, nganti ketemu ing kuliah sabanjure! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION