JavaRush /Java Blog /Random-TK /Dizaýn nagyş adapteri

Dizaýn nagyş adapteri

Toparda çap edildi
Salam! Bu gün möhüm bir täze mowzuga - nagyşlara ýa-da başgaça aýdylanda - dizaýn nagyşlaryna degip geçeris . Nagyşlar näme? "Tigiri täzeden dikeltmäň" sözüni bilýärsiňiz öýdýärin. Programmirlemekde, beýleki köp ugurlarda bolşy ýaly, adaty ýagdaýlar köp. Olaryň her biri üçin programmirleme işinde taýýar iş çözgütleri döredildi. Bular dizaýn nagyşlary. Deňeşdirip görsek, bir nagyş, "programmaňyz bir zat etmeli bolsa, nädip etmeli" ýaly ýagdaýa çözgüt hödürleýän belli bir mysaldyr. Köp nagyşlar bar, ajaýyp kitap “Dizaýn nagyşlaryny öwrenmek” olara bagyşlanýar, hökman okamaly. Dizaýn nagşy "Adapter" - 2Mümkin boldugyça gysgaça aýtsak, bir nagyş umumy problemadan we eýýäm standartyň bir görnüşi hasaplanyp bilinjek çözgütden ybaratdyr. Şu günki leksiýamyzda “Adapter” atly nagyşlaryň biri bilen tanyşarys. Ady aýdýar we hakyky durmuşda adapterlere bir gezekden köp duş geldiňiz. Iň ýaýran adapterleriň biri, köp kompýuter we noutbuk bilen enjamlaşdyrylan kart okaýjylardyr. Dizaýn nagşy "Adapter" - 3Bizde haýsydyr bir ýat kartasy bar diýip göz öňüne getiriň. Mesele näme? Hakykat, kompýuter bilen nädip aragatnaşyk saklamalydygyny bilenok. Olaryň umumy interfeýsi ýok. Kompýuterde USB birikdirijisi bar, ýöne oňa ýat kartasyny salyp bilmersiňiz. Karty kompýutere salyp bolmaýar, şol sebäpli suratlarymyzy, wideolarymyzy we beýleki maglumatlarymyzy saklap bilmeris. Kart okaýjy bu meseläni çözýän adapterdir. Galyberse-de, onuň USB kabeli bar! Kartanyň özünden tapawutlylykda, kartoçkany kompýutere salyp bolýar. Kompýuter bilen umumy interfeýsi bar - USB. Mysal bilen nähili boljakdygyny göreliň:
public interface USB {

   void connectWithUsbCable();
}
Bu, USB kabelini salmagyň ýeke-täk usuly bolan USB interfeýsimizdir:
public class MemoryCard {

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

   public void copyData() {
       System.out.println("Данные скопированы на компьютер!");
   }
}
Memoryat kartasyny durmuşa geçirýän bu synpymyz. Onda eýýäm bize zerur 2 usul bar, ýöne mesele: USB interfeýsini amala aşyrmaýar. Karty USB ýerine salyp bolmaýar.
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();
   }
}
Ine, adapterimiz! SynpCardReader näme edýär we näme üçin adapter? Bu ýönekeý. Uýgunlaşdyrylan synp (ýat kartasy) adapteriň meýdanlarynyň birine öwrülýär. Bu mantykly, sebäbi hakyky durmuşda kartoçkanyň içine kartoçka hem salýarys we ol hem onuň bir bölegine öwrülýär. Cardat kartasyndan tapawutlylykda adapteriň kompýuter bilen umumy interfeýsi bar. USB kabeli bar, ýagny USB arkaly beýleki enjamlara birigip bilýär. Şonuň üçin programmada synpymyz CardReaderUSB interfeýsini amala aşyrýar. Emma bu usulyň içinde näme bolýar? We zerur zatlarymyz bolýar! Adapter eseri ýat kartamyza tabşyrýar. Galyberse-de, adapteriň özi hiç zat edenok; kart okaýjynyň özbaşdak işlemegi ýok. Onuň işi, kartoçkanyň işini ýerine ýetirip we faýllary göçürip bilmek üçin diňe kompýuter bilen ýat kartasyny baglanyşdyrmakdyr! connectWithUsbCable()Adapterimiz , ýat kartasynyň “zerurlyklary” üçin öz interfeýsini (usulyny) üpjün edip, muny etmäge mümkinçilik berýär . Geliň, ýat kartasyndan maglumatlary göçürmek isleýän adamy simulasiýa etjek haýsydyr bir müşderi programmasyny döredeliň:
public class Main {

   public static void main(String[] args) {

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

   }
}
Netijede näme aldyk? Konsol çykyşy:
Карта памяти успешно вставлена!
Данные скопированы на компьютер!
Gowy, biziň wezipämiz üstünlikli ýerine ýetirildi! Adapter nagşy barada maglumat bilen goşmaça baglanyşyklar:

Abstrakt sapaklar Okyjy we ýazyjy

Indi halaýan güýmenjimize gaýdyp geleris: giriş we çykyş bilen işlemek üçin birnäçe täze sapak öwreneris :) Olaryň näçesini eýýäm öwrendik, haýran? Bu gün sapaklar Readerwe Writer. Näme üçin olar hakda? Sebäbi bu öňki bölümimiz - adapterler bilen baglanyşykly bolar. Geliň, has jikme-jik seredeliň. Geliň, Readera. Readerabstrakt synp, şonuň üçin obýektlerini aç-açan döredip bilmeris. Emma aslynda siz ony eýýäm tanaýarsyňyz! Galyberse-de, gowy bilýän sapaklaryňyz onuň BufferedReadermirasdüşerleri InputStreamReader:)
public class BufferedReader extends Reader {}

public class InputStreamReader extends Reader {}
Şeýlelikde, synp InputStreamReaderklassiki adapterdir . Probablyadyňyzda bolsa, bir obýekti konstruktoryna geçirip bileris InputStream. Köplenç munuň üçin üýtgeýjini ulanýarys System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Näme edýär InputStreamReader? Islendik adapter ýaly, bir interfeýsi beýlekisine öwürýär. Bu ýagdaýda interfeýs InputStream'a interfeýsine Reader' a. Ilki bilen synpymyz bardy InputStream. Gowy işleýär, ýöne diňe aýratyn baýtlary okap bilýär. Mundan başga-da, abstrakt synpymyz bar Reader. Bize hakykatdanam zerur bolan ajaýyp funksiýa bar - nyşanlary okap biler! Elbetde, bize bu mümkinçilik gerek. Hereöne bu ýerde adapterleriň adatça çözýän klassiki meselesi - interfeýsiň gabat gelmezligi bilen ýüzbe-ýüz bolýarys. Özüni nähili görkezýär? Geliň, Oracle resminamalaryna göni seredeliň. Ine synp usullary InputStream. Паттерн проектирования «Адаптер» - 4Usullaryň toplumy interfeýsdir. Görşüňiz ýaly, read()bu synpyň usuly bar (hatda birnäçe wersiýada-da), ýöne ol diňe baýtlary okap biler: ýa aýratyn baýt, ýa-da bufer ulanyp birnäçe baýt. Bu opsiýa bize laýyk däl - nyşanlary okamak isleýäris. Bize zerur bolan funksiýa eýýäm abstrakt synpda ýerine ýetirildiReader . Muny resminamalarda hem görmek bolýar. Паттерн проектирования «Адаптер» - 5Şeýle-de bolsa, InputStream'a' we Reader'a' interfeýsleri biri-birine gabat gelmeýär! Görşüňiz ýaly, ähli usul amallarynda, read()geçen parametrler we yzyna gaýtarmak bahalary tapawutlanýar. Ine, bize gerek ýer InputStreamReader! Ol synplarymyzyň arasynda adapter hökmünde çykyş eder . Aboveokarda seredip geçen kart okaýjymyzdaky mysalda bolşy ýaly, “uýgunlaşdyrylan” synpyň obýektini “içerde”, ýagny adapter synpynyň konstruktoryna geçirýäris. Öňki mysalda MemoryCardiçerde bir obýekt geçirdik CardReader. InputStreamIndi obýekti konstruktora geçirýäris InputStreamReader! Hil hökmünde InputStreameýýäm tanyş üýtgeýjini ulanýarys System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
Hakykatdanam: resminamalara seredip, InputStreamReader“uýgunlaşmagyň” üstünlikli bolandygyny göreris :) Indi nyşanlary okamaga mümkinçilik berýän usullarymyz bar. Паттерн проектирования «Адаптер» - 6Ilkibaşda obýektimiz System.in(klawiatura bilen baglanan sapak) muňa rugsat bermedik hem bolsa, Adapter nagşyny döredip, dil döredijiler bu meseläni çözdüler. Abstrakt synp Reader, I / O synplaryň köpüsi ýaly ekiz dogany bar - Writer. Şol bir uly artykmaçlygy bar Reader- nyşanlar bilen işlemek üçin amatly interfeýsi üpjün edýär. Çykyş akymlary bilen mesele we onuň çözgüdi giriş akymlaryndaky ýaly görünýär. OutputStreamDiňe baýt ýazyp bilýän synp bar ; Nyşanlar bilen işläp bilýän abstrakt synp bar Writerwe iki sany gabat gelmeýän interfeýs bar. Bu mesele Adapter nagşy bilen ýene-de üstünlikli çözülýär. Bir synp ulanyp, iki synp interfeýsini aňsatlyk bilen OutputStreamWriter“uýgunlaşdyryp” bileris . Konstruktordaky baýt akymyny alanymyzdan soň , baýt däl-de, simwol ýazyp bileris! WriterOutputStreamOutputStreamOutputStreamWriter
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();
   }
}
Faýlymyza 32144 - code kody bilen bir nyşan ýazdyk, şeýlelik bilen baýt bilen işlemek zerurlygyny aradan aýyrdyk :) Bularyň hemmesi şu gün, indiki leksiýalarda görüşeris! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION