JavaRush /Java Blog /Random-TK /Proksi dizaýn nagşy

Proksi dizaýn nagşy

Toparda çap edildi
Programmirlemekde programma arhitekturasyny dogry meýilleşdirmek möhümdir. Munuň üçin aýrylmaz gural dizaýn nagyşlarydyr. Bu gün proksi ýa-da başga bir söz bilen aýdylanda, orunbasar hakda gürleşeris.

Deputat näme üçin gerek?

Bu nagyş, bir obýekte gözegçilik etmek bilen baglanyşykly meseleleri çözmäge kömek edýär. Size bir soragyňyz bolup biler: "Näme üçin bize beýle gözegçilik edilýär?" Nämäniň nämedigini anyklamaga kömek etjek birnäçe ýagdaýa seredeliň.

Mysal 1

Geliň, bir topar köne kodly uly taslamamyz bar, bu ýerde maglumatlar bazasyndan hasabatlary göçürip almak üçin jogapkär synp bar. Synp sinhron işleýär, ýagny maglumatlar bazasy haýyşy ýerine ýetirýän mahaly tutuş ulgam boş. Orta hasap bilen 30 minutda hasabat döredilýär. Bu aýratynlyk sebäpli, ýüklemek 00: 30-da başlaýar we ýolbaşçylar bu hasabaty irden alýarlar. Derňewiň dowamynda hasabat döredilenden soň, ýagny bir günüň içinde derrew alynmalydygy ýüze çykdy. Başlangyç wagtyny üýtgetmek mümkin däl, sebäbi ulgam maglumatlar bazasyndan jogap garaşýar. Çözüw, ýüklemäni başlamak we aýratyn sapakda hasabat bermek bilen iş prinsipini üýtgetmek. Bu çözgüt ulgamyň hemişeki ýaly işlemegine mümkinçilik döreder we dolandyryş täze hasabatlar alar. Şeýle-de bolsa, bir mesele bar: häzirki kody täzeden ýazyp bolmaýar, sebäbi onuň funksiýalary ulgamyň beýleki bölekleri tarapyndan ulanylýar. Bu ýagdaýda hasabat ýüklemek, başlangyç wagtyny hasaba almak we aýratyn sapak açmak üçin haýyş bilen Deputat nagşyny ulanyp, aralyk proksi synpyny hödürläp bilersiňiz. Hasabat döredilende, sapak işini tamamlar we hemmeler begener.

Mysal 2

Ösüş topary afişa web sahypasyny döredýär. Täze wakalar barada maglumat almak üçin, ýörite ýapyk kitaphananyň üsti bilen amala aşyrylýan üçünji tarap hyzmatyna ýüz tutýarlar. Ösüş döwründe bir mesele ýüze çykdy: üçünji tarap ulgamy günde bir gezek maglumatlary täzeleýär we ulanyjy her gezek sahypany täzeläninde oňa haýyş edilýär. Bu köp sanly haýyş döredýär we hyzmat jogap bermegi bes edýär. Çözüw, hyzmatyň jogabyny keş etmek we her açylanda täzeden gelýänlere tygşytlanan netijäni bermek, bu keş keşini zerur bolanda täzeläp. Bu ýagdaýda, orunbasar nagşyny ulanmak, gutarnykly işlemän üýtgemezden ajaýyp çözgütdir.

Nagyş nähili işleýär

Bu nagşy durmuşa geçirmek üçin proksi synpyny döretmeli. Müşderi kody üçin özüni alyp barşyny simulasiýa edip, hyzmat synp interfeýsini amala aşyrýar. Şeýlelik bilen, müşderi hakyky obýektiň ýerine öz wekili bilen aragatnaşyk saklaýar. Adatça, ähli haýyşlar hyzmat synpyna geçirilýär, ýöne jaňdan öň ýa-da soň goşmaça hereketler bilen. Plyönekeý söz bilen aýdylanda, bu proksi obýekt müşderi kody bilen maksatly obýektiň arasyndaky gatlakdyr. Örän haýal köne diskden haýyşy keşlemegiň mysalyna seredeliň. Işleýiş ýörelgesini üýtgedip bolmaýan käbir gadymy programmada elektrik otly tertibi bolsun. Täzelenen tertipli disk her gün belli bir wagtda goýulýar. Şeýlelikde bizde bar:
  1. Interfeýs TimetableTrains.
  2. TimetableElectricTrainsBu interfeýsi amala aşyrýan synp .
  3. Hut şu synp arkaly müşderi kody disk faýl ulgamy bilen täsirleşýär.
  4. Müşderi synpy DisplayTimetable. Usuly, printTimetable()usullaryny ulanýar TimetableElectricTrains.
Bu shema ýönekeý: Proksi dizaýn nusgasy - 2Häzirki wagtda her gezek usul diýlende printTimetable()synp TimetableElectricTrainsdiske girýär, maglumatlary düşürýär we müşderä berýär. Bu ulgam gowy işleýär, ýöne gaty haýal. Şonuň üçin keş keşini goşmak arkaly ulgamyň işleýşini ýokarlandyrmak kararyna gelindi. Bu, “Proxy” nagşyny ulanyp amala aşyrylyp bilner: Proksi dizaýn nusgasy - 3Şeýlelik bilen synp, öňki synp bilen däl-de, DisplayTimetablesynp bilen täsirleşýändigini duýmaz . TimetableElectricTrainsProxyTäze ýerine ýetiriş tertibi günde bir gezek ýüklenýär we gaýta-gaýta haýyşlar bilen eýýäm ýüklenen obýekti ýatdan yzyna gaýtaryp berýär.

Proxy ulanmak haýsy meseleler üçin has gowudyr?

Ine, bu nagşyň hökman peýdaly boljak birnäçe ýagdaýy:
  1. Keşleme.
  2. Yalta durmuşa geçirmek, ýalta durmuşa geçirmek hem diýilýär. Zerur bolanda ýükläp bilýän bolsaňyz, näme üçin birbada birbada ýükläň?
  3. Giriş haýyşlary.
  4. Aralyk maglumatlar we giriş barlaglary.
  5. Paralel gaýtadan işlemek sapaklaryny açmak.
  6. Çagyryşyň taryhyny ýazga almak ýa-da sanamak.
Başga ulanylyş ýagdaýlary hem bar. Bu nagşyň işleýiş ýörelgesine düşünip, munuň üçin üstünlikli programma tapyp bilersiňiz. Bir seretseň, Deputat Facade ýaly bir zat edýär , ýöne beýle däl. Proksi hyzmat obýekti bilen birmeňzeş interfeýse eýe . Şeýle hem, nagşy bezegçi ýa-da adapter bilen garyşdyrmaň . Bezegçi giňeldilen interfeýsi üpjün edýär, Adapter bolsa alternatiw interfeýsi üpjün edýär.

Üstünlikleri we kemçilikleri

  • + Hyzmat obýektine isleýşiňiz ýaly gözegçilik edip bilersiňiz;
  • + Hyzmat obýektiniň ömrüni dolandyrmak üçin goşmaça mümkinçilikler;
  • + Hyzmat obýekti bolmazdan işleýär;
  • + Kodyň işleýşini we howpsuzlygyny ýokarlandyrýar.
  • - Goşmaça bejergiler sebäpli öndürijiligiň ýaramazlaşmak howpy bar;
  • - Programma sapaklarynyň gurluşyny çylşyrymlaşdyrýar.

Iş ýüzünde çalyşma

Geliň, diskden otly meýilnamalaryny okaýan ulgamy durmuşa geçireliň:
public interface TimetableTrains {
   String[] getTimetable();
   String getTrainDepartureTime();
}
Esasy interfeýsi amala aşyrýan synp:
public class TimetableElectricTrains implements TimetableTrains {

   @Override
   public String[] getTimetable() {
       ArrayList<String> list = new ArrayList<>();
       try {
           Scanner scanner = new Scanner(new FileReader(new File("/tmp/electric_trains.csv")));
           while (scanner.hasNextLine()) {
               String line = scanner.nextLine();
               list.add(line);
           }
       } catch (IOException e) {
           System.err.println("Error:  " + e);
       }
       return list.toArray(new String[list.size()]);
   }

   @Override
   public String getTrainDepartureTime(String trainId) {
       String[] timetable = getTimetable();
       for(int i = 0; i<timetable.length; i++) {
           if(timetable[i].startsWith(trainId+";")) return timetable[i];
       }
       return "";
   }
}
Her gezek otlylaryň tertibini almaga synanyşanyňyzda, programma faýly diskden okaýar. Emma bular henizem güller. Faýl diňe bir otlynyň tertibini almak üçin her gezek okalýar! Şeýle koduň diňe erbet mysallarda barlygy gowy zat :) Müşderi synpy:
public class DisplayTimetable {
   private TimetableTrains timetableTrains = new TimetableElectricTrains();

   public void printTimetable() {
       String[] timetable = timetableTrains.getTimetable();
       String[] tmpArr;
       System.out.println("Поезд\tОткуда\tКуда\t\tВремя отправления\tВремя прибытия\tВремя в пути");
       for(int i = 0; i < timetable.length; i++) {
           tmpArr = timetable[i].split(";");
           System.out.printf("%s\t%s\t%s\t\t%s\t\t\t\t%s\t\t\t%s\n", tmpArr[0], tmpArr[1], tmpArr[2], tmpArr[3], tmpArr[4], tmpArr[5]);
       }
   }
}
Mysal faýly:

9B-6854;Лондон;Прага;13:43;21:15;07:32
BA-1404;Париж;Грац;14:25;21:25;07:00
9B-8710;Прага;Вена;04:48;08:49;04:01;
9B-8122;Прага;Грац;04:48;08:49;04:01
Synag edeliň:
public static void main(String[] args) {
   DisplayTimetable displayTimetable = new DisplayTimetable();
   displayTimetable.printTimetable();
}
Netije:

Поезд  Откуда  Куда   Время отправления Время прибытия    Время в пути
9B-6854  Лондон  Прага    13:43         21:15         07:32
BA-1404  Париж   Грац   14:25         21:25         07:00
9B-8710  Прага   Вена   04:48         08:49         04:01
9B-8122  Прага   Грац   04:48         08:49         04:01
Indi nagşymyzy durmuşa geçirmegiň ädimlerinden geçeliň:
  1. Asyl obýektiň ýerine täze proksi ulanmaga mümkinçilik berýän interfeýsi kesgitläň. Biziň mysalymyzda TimetableTrains.

  2. Proksi synpyny dörediň. Onda hyzmat obýektine salgylanma bolmaly (synpda dörediň ýa-da konstruktordan geçiň);

    Ine, biziň proksi synpymyz:

    public class TimetableElectricTrainsProxy implements TimetableTrains {
       // Ссылка на оригинальный an object
       private TimetableTrains timetableTrains = new TimetableElectricTrains();
    
       private String[] timetableCache = null
    
       @Override
       public String[] getTimetable() {
           return timetableTrains.getTimetable();
       }
    
       @Override
       public String getTrainDepartureTime(String trainId) {
           return timetableTrains.getTrainDepartureTime(trainId);
       }
    
       public void clearCache() {
           timetableTrains = null;
       }
    }

    Bu etapda, asyl obýekte salgylanmak bilen synp döredýäris we ähli jaňlary oňa geçirýäris.

  3. Proksi synpyň logikasyny durmuşa geçirýäris. Esasan jaň hemişe asyl obýekte gönükdirilýär.

    public class TimetableElectricTrainsProxy implements TimetableTrains {
       // Ссылка на оригинальный an object
       private TimetableTrains timetableTrains = new TimetableElectricTrains();
    
       private String[] timetableCache = null
    
       @Override
       public String[] getTimetable() {
           if(timetableCache == null) {
               timetableCache = timetableTrains.getTimetable();
           }
           return timetableCache;
       }
    
       @Override
       public String getTrainDepartureTime(String trainId) {
           if(timetableCache == null) {
               timetableCache = timetableTrains.getTimetable();
           }
           for(int i = 0; i < timetableCache.length; i++) {
               if(timetableCache[i].startsWith(trainId+";")) return timetableCache[i];
           }
           return "";
       }
    
       public void clearCache() {
           timetableTrains = null;
       }
    }

    Usul, getTimetable()tertip massiwiniň ýatda saklanandygyny ýa-da ýokdugyny barlaýar. Notok bolsa, netijäni saklap, maglumatlary diskden ýüklemek haýyşy berilýär. Isleg eýýäm işleýän bolsa, bir obýekti ýatdan çalt yzyna gaýtarar.

    Simpleönekeý işleýşi sebäpli getTrainDepartireTime () usuly asyl obýekte gönükdirilmeli däldi. Diňe onuň işleýşini täze usula köpeltdik.

    Muny edip bilmersiň Kody köpeltmeli ýa-da şuňa meňzeş manipulýasiýa etmeli bolsa, bu bir zadyň nädogry bolandygyny aňladýar we meselä başgaça seretmeli. Simpleönekeý mysalymyzda başga ýol ýok, ýöne hakyky taslamalarda kod has dogry ýazylar.

  4. Müşderi kodyndaky asyl obýektiň döredilmegini çalyşýan obýekt bilen çalyşyň:

    public class DisplayTimetable {
       // Измененная link
       private TimetableTrains timetableTrains = new TimetableElectricTrainsProxy();
    
       public void printTimetable() {
           String[] timetable = timetableTrains.getTimetable();
           String[] tmpArr;
           System.out.println("Поезд\tОткуда\tКуда\t\tВремя отправления\tВремя прибытия\tВремя в пути");
           for(int i = 0; i<timetable.length; i++) {
               tmpArr = timetable[i].split(";");
               System.out.printf("%s\t%s\t%s\t\t%s\t\t\t\t%s\t\t\t%s\n", tmpArr[0], tmpArr[1], tmpArr[2], tmpArr[3], tmpArr[4], tmpArr[5]);
           }
       }
    }

    Synag

    
    Поезд  Откуда  Куда   Время отправления Время прибытия    Время в пути
    9B-6854  Лондон  Прага    13:43         21:15         07:32
    BA-1404  Париж   Грац   14:25         21:25         07:00
    9B-8710  Прага   Вена   04:48         08:49         04:01
    9B-8122  Прага   Грац   04:48         08:49         04:01

    Gowy, dogry işleýär.

    Şeýle hem, käbir şertlere baglylykda asyl obýekti we çalyşýan obýekti döredýän zawody göz öňünde tutup bilersiňiz.

Nokadyň ýerine peýdaly baglanyşyk

  1. Nagyşlar barada ajaýyp makala we “Deputat” hakda azajyk

Bularyň hemmesi şu gün üçin! Öwrenmäge gaýdyp, täze bilimleriňizi iş ýüzünde synap görseňiz gowy bolardy :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION