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:- Interfeýs
TimetableTrains
. TimetableElectricTrains
Bu interfeýsi amala aşyrýan synp .- Hut şu synp arkaly müşderi kody disk faýl ulgamy bilen täsirleşýär.
- Müşderi synpy
DisplayTimetable
. Usuly,printTimetable()
usullaryny ulanýarTimetableElectricTrains
.
printTimetable()
synp TimetableElectricTrains
diske 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: Şeýlelik bilen synp, öňki synp bilen däl-de, DisplayTimetable
synp bilen täsirleşýändigini duýmaz . TimetableElectricTrainsProxy
Tä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:- Keşleme.
- 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äň?
- Giriş haýyşlary.
- Aralyk maglumatlar we giriş barlaglary.
- Paralel gaýtadan işlemek sapaklaryny açmak.
- Çagyryşyň taryhyny ýazga almak ýa-da sanamak.
Ü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ň:
-
Asyl obýektiň ýerine täze proksi ulanmaga mümkinçilik berýän interfeýsi kesgitläň. Biziň mysalymyzda
TimetableTrains
. -
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.
-
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.
-
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
-
Nagyşlar barada ajaýyp makala we “Deputat” hakda azajyk
GO TO FULL VERSION