JavaRush /Блоги Java /Random-TG /Адаптери намунаи тарроҳӣ

Адаптери намунаи тарроҳӣ

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо ба як мавзӯи нави муҳим дахл хоҳем кард - намунаҳо, ё ба ибораи дигар - намунаҳои тарроҳӣ . Намунаҳо чист? Ман фикр мекунам, ки шумо ибораи "чархро аз нав ихтироъ накунед" -ро медонед. Дар барномасозӣ, мисли дигар соҳаҳо, шумораи зиёди ҳолатҳои маъмулӣ мавҷуданд. Барои ҳар яки онҳо, дар раванди таҳияи барномасозӣ, қарорҳои кории омода сохта шудаанд. Инҳо намунаҳои тарроҳӣ мебошанд. Нисбатан, намуна як намунаи муайянест, ки ҳалли вазъиятро пешниҳод мекунад: "агар барномаи шумо кореро анҷом диҳад, чӣ гуна беҳтар кардан лозим аст." Намунаҳои зиёде мавҷуданд, китоби аълои "Омӯзиши намунаҳои тарроҳӣ" ба онҳо бахшида шудааст, ки шумо бояд ҳатман хонед. Намунаи тарҳрезии "Адаптер" - 2То ҳадди имкон мухтасар гуем, намуна аз як масъалаи умумӣ ва ҳалли он иборат аст, ки онро аллакай як навъ стандарт ҳисобидан мумкин аст. Дар лексияи имрӯза мо бо яке аз ин қолабҳо бо номи «Адаптер» шинос мешавем. Номи он нақл аст ва шумо дар ҳаёти воқеӣ на як маротиба бо адаптерҳо дучор омадаед. Яке аз маъмултарин адаптерҳо корти хонандаҳост, ки бо бисёр компютерҳо ва ноутбукҳо муҷаҳҳаз мебошанд. Намунаи тарроҳии адаптер - 3Тасаввур кунед, ки мо як намуди корти хотира дорем. Мушкил чист? Гап дар сари он аст, ки вай бо компютер муомила карданро намедонад. Онҳо интерфейси умумӣ надоранд. Компютер пайвасткунаки USB дорад, аммо шумо наметавонед корти хотираро ба он дохил кунед. Кортро ба компютер ворид кардан мумкин нест, бинобар ин мо наметавонем аксҳо, видеоҳо ва дигар маълумотҳои худро захира кунем. Кортхонанда адаптерест, ки ин мушкилотро ҳал мекунад. Охир, он сими USB дорад! Баръакси худи корт, корти хонандаро ба компютер ворид кардан мумкин аст. Онҳо дорои интерфейси умумӣ бо компютер - USB. Биёед бубинем, ки он бо як мисол чӣ гуна хоҳад буд:
public interface USB {

   void connectWithUsbCable();
}
Ин интерфейси USB-и мо бо усули ягонаи ворид кардани сими USB мебошад:
public class MemoryCard {

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

   public void copyData() {
       System.out.println("Данные скопированы на компьютер!");
   }
}
Ин синфи мост, ки харитаи хотираро амалӣ мекунад. Он аллакай 2 усуле дорад, ки ба мо лозим аст, аммо мушкилот дар ин ҷост: он интерфейси USB-ро татбиқ намекунад. Кортро ба ковокии 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();
   }
}
Ва ин ҷо адаптери мост! СинфCardReader чӣ кор мекунад ва чаро он адаптер аст? Ин оддӣ аст. Синфи мутобиқшаванда (харитаи хотира) яке аз майдонҳои адаптер мегардад. Ин мантиқист, зеро дар ҳаёти воқеӣ мо инчунин кортро дар дохor корти хонанда ҷойгир мекунем ва он ҳам як қисми он мешавад. Баръакси корти хотира, адаптер интерфейси умумӣ бо компютер дорад. Он дорои сими USB мебошад, яъне он метавонад ба дастгоҳҳои дигар тавассути USB пайваст шавад. Аз ин рӯ, дар барнома синфи мо CardReaderинтерфейси USB-ро амалӣ мекунад. Аммо дар дохor ин усул чӣ мешавад? Ва маҳз ҳамон чизест, ки ба мо лозим аст! Адаптер корро ба корти хотираи мо вогузор мекунад. Дар ниҳоят, худи адаптер ҳеҷ кор намекунад, корти хонанда ягон вазифаи мустақил надорад. Вазифаи он танҳо пайваст кардани компютер ва корти хотира аст, то корт кори худро иҷро кунад ва файлҳоро нусхабардорӣ кунад! Адаптери мо ба он имкон медиҳад, ки ин корро тавассути таъмин намудани интерфейси худ (усул connectWithUsbCable()) барои "талабот" -и корти хотира иҷро кунад. Биёед як намуди барномаи муштариро эҷод кунем, ки шахсеро, ки мехоҳад маълумотро аз корти хотира нусхабардорӣ кунад, тақлид кунад:
public class Main {

   public static void main(String[] args) {

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

   }
}
Дар натиҷа мо чӣ ба даст овардем? Натиҷаи консол:
Карта памяти успешно вставлена!
Данные скопированы на компьютер!
Аҷаб, вазифаи мо бомуваффақият иҷро шуд! Инҳоянд чанд истинодҳои иловагӣ бо маълумот дар бораи намунаи адаптер:

Синфҳои реферат Хонанда ва Нависанда

Ҳоло мо ба вақтхушии дӯстдоштаи худ бармегардем: мо якчанд дарсҳои навро барои кор бо воридот ва баромад меомӯзем :) Чӣ қадари онҳоро мо аллакай омӯхтаем, ман ҳайронам? Имрӯз мо дар бораи синфҳо Readerва Writer. Чаро дар бораи онҳо? Зеро ин ба бахши қаблии мо - адаптерҳо алоқаманд хоҳад буд. Биёед онҳоро муфассалтар дида бароем. Биёед бо Reader"а" оғоз кунем. Readerсинфи абстрактӣ аст, бинобар ин мо наметавонем an objectҳои онро ба таври возеҳ эҷод кунем. Аммо дар асл, шумо аллакай ӯро мешиносед! Охир, синфҳое, ки шумо хуб медонед, ворисони он BufferedReaderҳастанд :)InputStreamReader
public class BufferedReader extends Reader {}

public class InputStreamReader extends Reader {}
Ҳамин тавр, синф InputStreamReaderяк адаптери классикӣ аст . Тавре ки шумо эҳтимол дар ёд доред, мо метавонем an objectро ба созандаи он гузаронем InputStream. Аксар вақт мо як тағирёбандаро барои ин истифода мебарем System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Он чӣ кор мекунад InputStreamReader? Мисли ҳама гуна адаптер, он як интерфейсро ба интерфейси дигар табдил медиҳад. Дар ин ҳолат, интерфейси InputStream'a ба интерфейси Reader'a. Дар аввал мо синф доштем InputStream. Он хуб кор мекунад, аммо он метавонад танҳо byteҳои алоҳида хонад. Илова бар ин, мо синфи абстрактӣ дорем Reader. Он дорои функсияҳои аълоест, ки ба мо воқеан лозим аст - он метавонад аломатҳоро хонад! Мо, албатта, ба ин имконият хеле зарур аст. Аммо дар ин ҷо мо бо мушкилоти классикӣ дучор мешавем, ки адаптерҳо одатан ҳал мекунанд - номувофиқатии интерфейс. Он чӣ гуна худро зоҳир мекунад? Биёед бевосита ба ҳуҷҷатҳои Oracle назар кунем. Инҳоянд усулҳои синф InputStream. Намунаи тарҳрезии "Адаптер" - 4Маҷмӯи усулҳо интерфейс аст. Тавре ки шумо мебинед, read()ин синф метод дорад (ҳатто дар якчанд versionҳо), аммо он метавонад танҳо byteҳоро хонад: ё byteҳои инфиродӣ ё якчанд byte бо истифода аз буфер. Ин вариант ба мо мувофиқ нест - мо мехоҳем аломатҳоро хонем. Функсияе, ки ба мо лозим аст , аллакай дар синфи абстрактӣ амалӣ карда шудаастReader . Инро дар ҳуҷҷатҳо низ дидан мумкин аст. Намунаи тарроҳии адаптер - 5Аммо, интерфейсҳои InputStream'a' ва Reader'a' номувофиқанд! Тавре ки шумо мебинед, дар ҳама татбиқи усулҳо read()ҳам параметрҳои додашуда ва ҳам арзишҳои бозгашт фарқ мекунанд. Ва ин ҷоест, ки мо ба он ниёз дорем InputStreamReader! Вай ҳамчун адаптер дар байни синфҳои мо амал мекунад . Тавре ки дар мисоли корти хонанда, ки мо дар боло дида будем, мо an objectи синфи "мутобиқшуда" -ро "дар дохor", яъне ба конструктори синфи адаптер мегузорем. Дар мисоли қаблӣ мо an objectеро MemoryCardдар дохor CardReader. Акнун мо an objectро InputStreamба конструктор месупорем InputStreamReader! Ҳамчун сифат InputStreamмо тағирёбандаи аллакай шиносро истифода мебарем System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Ва дар ҳақиқат: бо дидани ҳуҷҷатҳо InputStreamReaderмо мебинем, ки "мутобиқшавӣ" муваффақ буд :) Ҳоло мо усулҳое дорем, ки ба мо ҳарфҳоро хондан имкон медиҳанд. Намунаи тарроҳии адаптер - 6Ва гарчанде ки дар аввал an objectи мо System.in(риштае, ки ба клавиатура пайваст) ба ин имкон намедиҳад, бо эҷоди намунаи адаптер , созандагони забон ин мушкилотро ҳал карданд. Синфи абстрактӣ Reader, ба монанди аксари синфҳои I/O, бародари дугоник дорад - Writer. Он як бартарии калон дорад Reader- он интерфейси қулайро барои кор бо рамзҳо таъмин мекунад. Бо ҷараёнҳои баромад, мушкилот ва ҳалли он ба мисли ҷараёни ҷараёнҳои воридотӣ монанданд. Синфест OutputStream, ки танҳо byte навишта метавонад; Синфи абстрактӣ вуҷуд дорад Writer, ки метавонад бо рамзҳо кор кунад ва ду интерфейси номувофиқ вуҷуд дорад. Ин мушкилот боз бо намунаи адаптер бомуваффақият ҳал карда мешавад. Бо истифода аз синф, OutputStreamWriterмо метавонем ба осонӣ ду интерфейси синфро Writerба OutputStreamҳамдигар "мутобиқ" кунем. OutputStreamВа, ки ҷараёни byteро дар конструктор гирифта , бо кӯмаки OutputStreamWriterмо метавонем аломатҳоро нависем, на 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();
   }
}
Мо дар файли худ аломатеро бо рамзи 32144 - 綐 навиштем ва ҳамин тавр зарурати кор бо byteҳоро аз байн бурдем :) Ин ҳама барои имрӯз аст, дар лексияҳои оянда вохӯрем! :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION