JavaRush /Java Blog /Random-ID /Adaptor Pola Desain

Adaptor Pola Desain

Dipublikasikan di grup Random-ID
Halo! Hari ini kita akan menyentuh topik baru yang penting - pola, atau dengan kata lain - pola desain . Apa itu pola? Saya rasa Anda tahu ungkapan “jangan menemukan kembali roda.” Dalam pemrograman, seperti di banyak bidang lainnya, ada banyak situasi yang umum. Untuk masing-masing dari mereka, dalam proses pengembangan pemrograman, solusi kerja yang siap pakai telah dibuat. Ini adalah pola desain. Secara relatif, suatu pola adalah contoh tertentu yang menawarkan solusi terhadap situasi seperti: “jika program Anda perlu melakukan sesuatu, bagaimana cara terbaik untuk melakukannya.” Ada banyak pola, buku bagus "Mempelajari Pola Desain" didedikasikan untuknya, yang pasti harus Anda baca. Pola desain "Adaptor" - 2Sederhananya, suatu pola terdiri dari masalah umum dan solusinya, yang sudah dapat dianggap semacam standar. Dalam kuliah hari ini kita akan mengenal salah satu pola yang disebut “Adaptor”. Namanya jelas, dan Anda telah menemukan adaptor di kehidupan nyata lebih dari sekali. Salah satu adaptor yang paling umum adalah pembaca kartu, yang dilengkapi dengan banyak komputer dan laptop. Pola desain adaptor - 3Bayangkan kita memiliki semacam kartu memori. Apa masalahnya? Faktanya adalah dia tidak tahu cara berinteraksi dengan komputer. Mereka tidak memiliki antarmuka yang sama. Komputer memiliki konektor USB, tetapi Anda tidak dapat memasukkan kartu memori ke dalamnya. Kartu tersebut tidak dapat dimasukkan ke dalam komputer, sehingga kami tidak dapat menyimpan foto, video, dan data lainnya. Pembaca kartu adalah adaptor yang memecahkan masalah ini. Lagi pula, ia memiliki kabel USB! Berbeda dengan kartu itu sendiri, pembaca kartu dapat dimasukkan ke dalam komputer. Mereka memiliki antarmuka yang sama dengan komputer - USB. Mari kita lihat tampilannya dengan sebuah contoh:
public interface USB {

   void connectWithUsbCable();
}
Ini adalah antarmuka USB kami dengan satu-satunya metode adalah memasukkan kabel USB:
public class MemoryCard {

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

   public void copyData() {
       System.out.println("Данные скопированы на компьютер!");
   }
}
Ini adalah kelas kami yang mengimplementasikan peta memori. Sudah ada 2 metode yang kita butuhkan, tapi inilah masalahnya: tidak mengimplementasikan antarmuka USB. Kartu tidak dapat dimasukkan ke dalam 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();
   }
}
Dan inilah adaptor kami! Apa yang dilakukan kelasCardReader dan mengapa merupakan adaptor? Itu mudah. Kelas yang diadaptasi (peta memori) menjadi salah satu bidang adaptor. Hal ini logis, karena dalam kehidupan nyata kita juga memasukkan kartu ke dalam card reader, dan itu juga menjadi bagian darinya. Berbeda dengan kartu memori, adaptor memiliki antarmuka yang sama dengan komputer. Ini memiliki kabel USB, artinya dapat terhubung ke perangkat lain melalui USB. Oleh karena itu, dalam program ini, kelas kami CardReadermengimplementasikan antarmuka USB. Tapi apa yang terjadi di dalam metode ini? Dan terjadilah apa yang kita butuhkan! Adaptor mendelegasikan pekerjaan ke kartu memori kita. Bagaimanapun, adaptor itu sendiri tidak melakukan apa pun, pembaca kartu tidak memiliki fungsi independen. Tugasnya hanya menghubungkan komputer dan kartu memori sehingga kartu tersebut dapat melakukan tugasnya dan menyalin file! Adaptor kami memungkinkannya melakukan ini dengan menyediakan antarmuka (metode connectWithUsbCable()) sendiri untuk “kebutuhan” kartu memori. Mari kita buat semacam program klien yang akan mensimulasikan seseorang yang ingin menyalin data dari kartu memori:
public class Main {

   public static void main(String[] args) {

       USB cardReader = new CardReader(new MemoryCard());
       cardReader.connectWithUsbCable();

   }
}
Apa yang kami dapatkan sebagai hasilnya? Keluaran konsol:
Карта памяти успешно вставлена!
Данные скопированы на компьютер!
Hebat, tugas kita telah berhasil diselesaikan! Berikut beberapa tautan tambahan dengan informasi tentang pola Adaptor:

Kelas abstrak Pembaca dan Penulis

Sekarang kita akan kembali ke hobi favorit kita: kita akan mempelajari beberapa kelas baru untuk bekerja dengan input dan output :) Berapa banyak yang sudah kita pelajari, ya? Hari ini kita akan berbicara tentang kelas Readerdan Writer. Kenapa dengan mereka? Karena ini akan terkait dengan bagian kami sebelumnya - adaptor. Mari kita lihat lebih detail. Mari kita mulai dengan Reader'a. Readeradalah kelas abstrak, jadi kita tidak akan bisa membuat objeknya secara eksplisit. Namun nyatanya, Anda sudah mengenalnya! Bagaimanapun, kelas yang Anda kenal baik BufferedReaderadalah InputStreamReaderpewarisnya :)
public class BufferedReader extends Reader {}

public class InputStreamReader extends Reader {}
Jadi, kelas InputStreamReaderadalah adaptor klasik . Seperti yang mungkin Anda ingat, kita dapat meneruskan suatu objek ke konstruktornya InputStream. Paling sering kita menggunakan variabel untuk ini System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Apa fungsinya InputStreamReader? Seperti adaptor apa pun, ia mengubah satu antarmuka ke antarmuka lainnya. Dalam hal ini, antarmuka InputStream'a ke antarmuka Reader' a. Awalnya kami satu kelas InputStream. Ini berfungsi dengan baik, tetapi hanya dapat membaca byte individual. Selain itu, kami memiliki kelas abstrak Reader. Ini memiliki fungsionalitas luar biasa yang sangat kami butuhkan - dapat membaca karakter! Kesempatan ini tentunya sangat kita butuhkan. Namun di sini kita dihadapkan pada masalah klasik yang biasanya diselesaikan oleh adaptor - ketidakcocokan antarmuka. Bagaimana cara mewujudkannya? Mari kita lihat langsung dokumentasi Oracle. Berikut adalah metode kelasnya InputStream. Pola desain "Adaptor" - 4Seperangkat metode adalah sebuah antarmuka. Seperti yang Anda lihat, read()kelas ini memiliki metode (bahkan dalam beberapa versi), tetapi hanya dapat membaca byte: baik byte individual, atau beberapa byte menggunakan buffer. Opsi ini tidak cocok untuk kami - kami ingin membaca karakter. Fungsionalitas yang kita butuhkan sudah diimplementasikan di kelas abstrakReader . Hal ini juga dapat dilihat pada dokumentasi. Pola desain adaptor - 5Namun, antarmuka InputStream'a' dan Reader'a' tidak kompatibel! Seperti yang Anda lihat, dalam semua implementasi metode, read()baik parameter yang diteruskan maupun nilai yang dikembalikan berbeda. Dan di sinilah kita membutuhkannya InputStreamReader! Dia akan bertindak sebagai Adaptor di antara kelas-kelas kita. Seperti pada contoh pembaca kartu, yang kita lihat di atas, kita meneruskan objek kelas "yang diadaptasi" "secara internal", yaitu ke konstruktor kelas adaptor. Pada contoh sebelumnya, kita melewatkan sebuah objek MemoryCarddi dalamnya CardReader. Sekarang kita meneruskan objek tersebut InputStreamke konstruktor InputStreamReader! Sebagai kualitas InputStreamkami menggunakan variabel yang sudah familiar System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Dan memang: dengan melihat dokumentasi InputStreamReaderkita akan melihat bahwa "adaptasi" berhasil :) Sekarang kita memiliki metode yang memungkinkan kita membaca karakter. Pola desain adaptor - 6Dan meskipun pada awalnya objek kami System.in(utas yang terikat ke keyboard) tidak mengizinkan hal ini, dengan membuat pola Adaptor , pembuat bahasa memecahkan masalah ini. Kelas abstrak Reader, seperti kebanyakan kelas I/O, memiliki saudara kembar - Writer. Ini memiliki keuntungan besar yang sama Reader- menyediakan antarmuka yang ramah pengguna untuk bekerja dengan simbol. Dengan aliran keluaran, masalah dan solusinya terlihat sama seperti pada aliran masukan. Ada kelas OutputStreamyang hanya bisa menulis byte; Ada kelas abstrak Writeryang bisa bekerja dengan simbol, dan ada dua antarmuka yang tidak kompatibel. Masalah ini kembali berhasil diselesaikan dengan pola Adaptor. Dengan menggunakan sebuah kelas, OutputStreamWriterkita dapat dengan mudah “menyesuaikan” dua antarmuka kelas satu Writersama OutputStreamlain. Dan, setelah menerima aliran byte OutputStreamdi konstruktor, dengan bantuan OutputStreamWritertersebut kita dapat menulis karakter, bukan byte!
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();
   }
}
Kami menulis karakter dengan kode 32144 - 綐 ke dalam file kami, sehingga menghilangkan kebutuhan untuk bekerja dengan byte :) Sekian untuk hari ini, sampai jumpa di kuliah berikutnya! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION