JavaRush /Blog Java /Random-MS /Penyesuai Corak Reka Bentuk

Penyesuai Corak Reka Bentuk

Diterbitkan dalam kumpulan
hello! Hari ini kita akan menyentuh topik baharu yang penting - corak, atau dengan kata lain - corak reka bentuk . Apakah corak? Saya rasa anda tahu ungkapan "jangan cipta semula roda". Dalam pengaturcaraan, seperti dalam banyak kawasan lain, terdapat sejumlah besar situasi biasa. Bagi setiap daripada mereka, dalam proses pembangunan pengaturcaraan, penyelesaian kerja siap sedia telah dibuat. Ini adalah corak reka bentuk. Secara relatifnya, corak ialah contoh tertentu yang menawarkan penyelesaian kepada situasi seperti: "jika program anda perlu melakukan sesuatu, cara terbaik untuk melakukannya." Terdapat banyak corak, sebuah buku yang sangat baik "Mempelajari Corak Reka Bentuk" didedikasikan untuk mereka, yang anda mesti baca. Corak reka bentuk "Penyesuai" - 2Untuk meletakkannya sesingkat mungkin, corak terdiri daripada masalah biasa dan penyelesaiannya, yang sudah boleh dianggap sebagai sejenis standard. Dalam kuliah hari ini kita akan berkenalan dengan salah satu corak ini yang dipanggil "Penyesuai". Namanya menarik, dan anda telah menemui penyesuai dalam kehidupan sebenar lebih daripada sekali. Salah satu penyesuai yang paling biasa ialah pembaca kad, yang dilengkapi dengan banyak komputer dan komputer riba. Corak reka bentuk "Penyesuai" - 3Bayangkan kita mempunyai sejenis kad memori. Apa masalahnya? Hakikatnya ialah dia tidak tahu bagaimana untuk berinteraksi dengan komputer. Mereka tidak mempunyai antara muka biasa. Komputer mempunyai penyambung USB, tetapi anda tidak boleh memasukkan kad memori ke dalamnya. Kad tidak boleh dimasukkan ke dalam komputer, kerana itu kami tidak akan dapat menyimpan foto, video dan data lain kami. Pembaca kad ialah penyesuai yang menyelesaikan masalah ini. Lagipun, ia mempunyai kabel USB! Tidak seperti kad itu sendiri, pembaca kad boleh dimasukkan ke dalam komputer. Mereka mempunyai antara muka yang sama dengan komputer - USB. Mari lihat bagaimana rupanya dengan contoh:
public interface USB {

   void connectWithUsbCable();
}
Ini ialah antara muka USB kami dengan satu-satunya kaedah ialah memasukkan kabel USB:
public class MemoryCard {

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

   public void copyData() {
       System.out.println("Данные скопированы на компьютер!");
   }
}
Ini adalah kelas kami yang melaksanakan peta memori. Ia sudah mempunyai 2 kaedah yang kami perlukan, tetapi inilah masalahnya: ia tidak melaksanakan antara muka USB. Kad tidak boleh 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 penyesuai kami! Apakah yang dilakukan oleh kelasCardReader dan mengapa ia penyesuai? Mudah sahaja. Kelas yang disesuaikan (peta memori) menjadi salah satu medan penyesuai. Ini adalah logik, kerana dalam kehidupan sebenar kita juga memasukkan kad di dalam pembaca kad, dan ia juga menjadi sebahagian daripadanya. Tidak seperti kad memori, penyesuai mempunyai antara muka yang sama dengan komputer. Ia mempunyai kabel USB, bermakna ia boleh menyambung ke peranti lain melalui USB. Oleh itu, dalam program ini, kelas kami CardReadermelaksanakan antara muka USB. Tetapi apa yang berlaku dalam kaedah ini? Dan berlaku apa yang kita perlukan! Penyesuai mewakilkan kerja ke kad memori kami. Lagipun, penyesuai itu sendiri tidak melakukan apa-apa; pembaca kad tidak mempunyai sebarang fungsi bebas. Tugasnya hanya untuk memautkan komputer dan kad memori supaya kad boleh melakukan tugasnya dan menyalin fail! Penyesuai kami membenarkannya melakukan ini dengan menyediakan antara muka (kaedah connectWithUsbCable()) sendiri untuk "keperluan" kad memori. Mari buat beberapa jenis program klien yang akan meniru seseorang yang ingin menyalin data daripada kad memori:
public class Main {

   public static void main(String[] args) {

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

   }
}
Apa yang kita dapat sebagai hasilnya? Output konsol:
Карта памяти успешно вставлена!
Данные скопированы на компьютер!
Hebat, tugas kami telah berjaya diselesaikan! Berikut ialah beberapa pautan tambahan dengan maklumat tentang corak Penyesuai:

Kelas abstrak Pembaca dan Penulis

Sekarang kita akan kembali ke hobi kegemaran kita: kita akan mempelajari beberapa kelas baharu untuk bekerja dengan input dan output :) Berapa ramai daripada mereka yang telah kita pelajari, saya tertanya-tanya? Hari ini kita akan bercakap tentang kelas Readerdan Writer. Kenapa dengan mereka? Kerana ini akan berkaitan dengan bahagian kami sebelumnya - penyesuai. Mari kita lihat mereka dengan lebih terperinci. Mari kita mulakan dengan Reader'a. Readerialah kelas abstrak, jadi kami tidak akan dapat mencipta objeknya secara eksplisit. Tetapi sebenarnya, anda sudah mengenalinya! Lagipun, kelas yang anda kenali BufferedReaderadalah InputStreamReaderpewarisnya :)
public class BufferedReader extends Reader {}

public class InputStreamReader extends Reader {}
Jadi, kelas InputStreamReaderialah penyesuai klasik . Seperti yang anda mungkin ingat, kita boleh menghantar objek kepada pembinanya InputStream. Selalunya kami menggunakan pembolehubah untuk ini System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Apa yang ia lakukan InputStreamReader? Seperti mana-mana penyesuai, ia menukar satu antara muka kepada yang lain. Dalam kes ini, antara muka InputStream'a ke antara muka Reader'a. Pada mulanya kami mempunyai kelas InputStream. Ia berfungsi dengan baik, tetapi ia hanya boleh membaca bait individu. Di samping itu, kami mempunyai kelas abstrak Reader. Ia mempunyai fungsi yang sangat baik yang kami perlukan - ia boleh membaca aksara! Kami, sudah tentu, sangat memerlukan peluang ini. Tetapi di sini kita berhadapan dengan masalah klasik yang biasanya diselesaikan oleh penyesuai - ketidakserasian antara muka. Bagaimana ia menampakkan dirinya? Mari lihat terus ke dalam dokumentasi Oracle. Berikut ialah kaedah kelas InputStream. Паттерн проектирования «Адаптер» - 4Satu set kaedah ialah antara muka. Seperti yang anda lihat, read()kelas ini mempunyai kaedah (walaupun dalam beberapa versi), tetapi ia hanya boleh membaca bait: sama ada bait individu atau beberapa bait menggunakan penimbal. Pilihan ini tidak sesuai dengan kami - kami mahu membaca aksara. Fungsi yang kami perlukan telah pun dilaksanakan dalam kelas abstrakReader . Ini juga boleh dilihat dalam dokumentasi. Паттерн проектирования «Адаптер» - 5Walau bagaimanapun, antara muka InputStream'a' dan Reader'a' tidak serasi! Seperti yang anda lihat, dalam semua pelaksanaan kaedah, read()kedua-dua parameter yang diluluskan dan nilai pulangan berbeza. Dan di sinilah kita memerlukannya InputStreamReader! Dia akan bertindak sebagai Adapter antara kelas kami. Seperti dalam contoh dengan pembaca kad, yang kita lihat di atas, kita lulus objek kelas "disesuaikan" "secara dalaman," iaitu, kepada pembina kelas penyesuai. Dalam contoh sebelumnya, kami melepasi objek MemoryCarddi dalam CardReader. Sekarang kita lulus objek InputStreamkepada pembina InputStreamReader! Sebagai kualiti InputStreamkami menggunakan pembolehubah yang sudah biasa System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Dan sesungguhnya: dengan melihat dokumentasi InputStreamReaderkita akan melihat bahawa "penyesuaian" berjaya :) Sekarang kita mempunyai kaedah pelupusan kita yang membolehkan kita membaca aksara. Паттерн проектирования «Адаптер» - 6Dan walaupun pada mulanya objek kami System.in(benang yang terikat pada papan kekunci) tidak membenarkan ini, dengan mencipta corak Penyesuai , pencipta bahasa menyelesaikan masalah ini. Kelas abstrak Reader, seperti kebanyakan kelas I/O, mempunyai saudara kembar - Writer. Ia mempunyai kelebihan besar yang sama Reader- ia menyediakan antara muka yang mudah untuk bekerja dengan simbol. Dengan aliran keluaran, masalah dan penyelesaiannya kelihatan sama seperti dalam kes aliran input. Terdapat kelas OutputStreamyang hanya boleh menulis bait; Terdapat kelas abstrak Writeryang boleh berfungsi dengan simbol, dan terdapat dua antara muka yang tidak serasi. Masalah ini sekali lagi berjaya diselesaikan oleh corak Penyesuai. Menggunakan kelas, OutputStreamWriterkita boleh dengan mudah "menyesuaikan" dua antara muka kelas Writerantara OutputStreamsatu sama lain. Dan, setelah menerima aliran bait OutputStreamdalam pembina, dengan bantuan OutputStreamWriterkita boleh, bagaimanapun, menulis aksara, bukan bait!
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 aksara dengan kod 32144 - 綐 ke dalam fail kami, dengan itu menghapuskan keperluan untuk bekerja dengan bait :) Itu sahaja untuk hari ini, jumpa anda dalam kuliah seterusnya! :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION