JavaRush /Блоги Java /Random-TG /Намунаи тарҳрезии прокси

Намунаи тарҳрезии прокси

Дар гурӯҳ нашр шудааст
Дар барномасозӣ дуруст ба нақша гирифтани меъмории барнома муҳим аст. Воситаи зарурӣ барои ин намунаҳои тарроҳӣ мебошад. Имрӯз мо дар бораи Прокси, ё ба ибораи дигар, Муовин сӯҳбат хоҳем кард.

Чаро ба шумо депутат лозим аст?

Ин намуна ба ҳалли мушкилоти марбут ба дастрасии идорашаванда ба an object кӯмак мекунад. Шояд шумо саволе дошта бошед: "Чаро ба мо чунин дастрасии назоратшаванда лозим аст?" Биёед якчанд ҳолатро дида бароем, ки ба шумо фаҳмед, ки чӣ гуна аст.

Мисол 1

Биёед тасаввур кунем, ки мо як лоиҳаи калон бо як хӯшаи codeҳои кӯҳна дорем, ки дар он синф барои зеркашии гузоришҳо аз пойгоҳи додаҳо масъул аст. Синф ба таври синхронӣ кор мекунад, яъне дар ҳоле ки пойгоҳи дода дархостро коркард мекунад, тамоми система бекор аст. Ба ҳисоби миёна, гузориш дар 30 дақиқа таҳия карда мешавад. Бинобар ин хусусият, боркунии он соати 00:30 оғоз мешавад ва роҳбарият ин гузоришро субҳ қабул мекунад. Дар рафти тахлил маълум шуд, ки хисоботро фавран баъди тартиб додани он, яъне дар давоми як руз кабул кардан лозим аст. Тағйир додани вақти оғоз кардан ғайриимкон аст, зеро система аз базаи маълумот интизор мешавад. Ҳалли ин тағир додани принсипи кор бо оғози боргузорӣ ва тавлиди гузориш дар риштаи алоҳида мебошад. Ин қарор имкон медиҳад, ки система ба таври муқаррарӣ кор кунад ва роҳбарият ҳисоботҳои нав қабул кунад. Бо вуҷуди ин, мушкилот вуҷуд дорад: рамзи ҷорӣро дубора навиштан мумкин нест, зеро функсияҳои онро қисмҳои дигари система истифода мебаранд. Дар ин ҳолат, шумо метавонед бо истифода аз намунаи Deputy синфи миёнаравро ҷорӣ кунед, ки он дархост барои бор кардани гузориш, сабти вақти оғоз ва оғози риштаи алоҳидаро қабул мекунад. Вақте ки гузориш тавлид мешавад, ришта кори худро анҷом медиҳад ва ҳама шод мешаванд.

Мисол 2

Гурӯҳи таҳиякунанда вебсайти плакатро эҷод мекунад. Барои гирифтани маълумот дар бораи рӯйдодҳои нав, онҳо ба хидмати тарафи сеюм муроҷиат мекунанд, ки ҳамкорӣ бо он тавассути китобхонаи махсуси пӯшида амалӣ карда мешавад. Ҳангоми таҳия мушкилот ба миён омад: системаи тарафи сеюм маълумотро дар як рӯз як маротиба нав мекунад ва дархост ба он ҳар дафъае, ки корбар саҳифаро нав мекунад, сурат мегирад. Ин шумораи зиёди дархостҳоро эҷод мекунад ва хидмат посух доданро қатъ мекунад. Ҳалли ин аст, ки кэш кардани посухи хидмат ва ба меҳмонон ҳангоми ҳар як аз нав боркунӣ натиҷаи захирашуда пешниҳод карда, ҳангоми зарурат ин кэшро навсозӣ кунад. Дар ин ҳолат, истифодаи намунаи муовин як роҳи беҳтарин бидуни тағир додани функсияи анҷомшуда мебошад.

Чӣ тавр намуна кор мекунад

Барои татбиқи ин намуна, шумо бояд синфи прокси эҷод кунед. Он интерфейси синфи хидматро амалӣ мекунад, ки рафтори онро барои рамзи муштарӣ тақлид мекунад. Ҳамин тариқ, ба ҷои an objectи воқеӣ, муштарӣ бо прокси худ ҳамкорӣ мекунад. Одатан, ҳама дархостҳо ба синфи хидматрасонӣ интиқол дода мешаванд, аммо бо амалҳои иловагӣ пеш аз занги он ё пас аз он. Оддӣ карда гӯем, ин an objectи прокси қабати байни рамзи муштарӣ ва an objectи мавриди ҳадаф аст. Биёед мисоли кэшкунии дархостро аз диски кӯҳнаи хеле суст бубинем. Бигзор он як ҷадвали қатораҳои барқӣ дар баъзе барномаҳои қадимӣ бошад, ки принсипи кори онро тағир додан мумкин нест. Диск бо ҷадвали навшуда ҳар рӯз дар вақти муайян гузошта мешавад. Пас, мо дорем:
  1. Интерфейс TimetableTrains.
  2. Синф TimetableElectricTrains, ки ин интерфейсро амалӣ мекунад.
  3. Маҳз тавассути ин синф рамзи муштарӣ бо системаи файлии диск ҳамкорӣ мекунад.
  4. Синфи муштарӣ DisplayTimetable. Усули он printTimetable()усулҳои TimetableElectricTrains.
Схема оддӣ аст: Намунаи тарроҳии прокси - 2Дар айни замон, ҳар вақте, ки метод даъват карда мешавад, printTimetable()синф TimetableElectricTrainsба диск дастрасӣ пайдо мекунад, маълумотро холӣ мекунад ва онро ба муштарӣ медиҳад. Ин система хуб кор мекунад, аммо хеле суст аст. Аз ин рӯ, тасмим гирифта шуд, ки самаранокии система тавассути илова кардани механизми кэшкунӣ афзоиш дода шавад. Инро бо истифода аз намунаи прокси анҷом додан мумкин аст: Намунаи тарроҳии прокси - 3Ҳамин тавр синф DisplayTimetableҳатто пай намебарад, ки он бо синф муошират мекунад TimetableElectricTrainsProxy, на бо синфи қаблӣ. Татбиқи нав ҷадвалро дар як рӯз як бор бор мекунад ва бо дархостҳои такрорӣ an objectи аллакай боршударо аз хотира бармегардонад.

Барои кадом вазифаҳо истифода бурдани прокси беҳтар аст?

Инҳоянд чанд ҳолатҳое, ки дар он ин намуна бешубҳа муфид хоҳад буд:
  1. Кэшкунӣ.
  2. Татбиқи танбал инчунин ҳамчун татбиқи танбал маълум аст. Чаро an objectро якбора бор кунед, вақте ки шумо метавонед онро дар ҳолати зарурӣ бор кунед?
  3. Сабти дархостҳо.
  4. Санҷиши маълумот ва дастрасӣ.
  5. Оғози риштаҳои коркарди параллелӣ.
  6. Сабт ё ҳисоб кардани таърихи занг.
Ҳолатҳои дигари истифода низ мавҷуданд. Бо фаҳмидани принсипи кори ин намуна, шумо худатон метавонед як барномаи муваффақи онро пайдо кунед. Дар назари аввал, Муовини ҳамон кореро мекунад Facade , аммо ин тавр нест. Прокси интерфейси ҳамон an objectи хидматрасониро дорад. Инчунин, намунаро бо Decorator ё Adapter омехта накунед . Декоратор интерфейси васеъро таъмин мекунад, дар ҳоле ки адаптер як алтернативӣ медиҳад.

Афзалиятҳо ва нуқсонҳо

  • + Шумо метавонед дастрасӣ ба an objectи хидматрасониро мувофиқи хоҳишатон назорат кунед;
  • + Имкониятҳои иловагӣ барои идоракунии давраи ҳаёти an objectи хидматрасонӣ;
  • + Бе an objectи хидматрасонӣ кор мекунад;
  • + Фаъолияти code ва амниятро беҳтар мекунад.
  • - хавфи бад шудани кор аз сабаби табобатҳои иловагӣ вуҷуд дорад;
  • — Сохтори дарсхои программавиро душвор мегардонад.

Намунаи ивазкунанда дар амал

Биёед бо шумо системаеро татбиқ кунем, ки ҷадвали қаторҳоро аз диск мехонад:
public interface TimetableTrains {
   String[] getTimetable();
   String getTrainDepartureTime();
}
Синф, ки интерфейси асосиро амалӣ мекунад:
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 "";
   }
}
Ҳар дафъае, ки шумо мехоҳед ҷадвали ҳамаи қаторҳоро гиред, барнома файлро аз диск мехонад. Аммо инҳо ҳанӯз гуланд. Файл инчунин ҳар дафъа хонда мешавад, ки шумо ҷадвали танҳо як қаторро гиред! Ин хуб аст, ки чунин code танҳо дар мисолҳои бад вуҷуд дорад :) Синфи муштарӣ:
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]);
       }
   }
}
Намунаи файл:

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
Биёед озмоиш кунем:
public static void main(String[] args) {
   DisplayTimetable displayTimetable = new DisplayTimetable();
   displayTimetable.printTimetable();
}
Хулоса:

Поезд  Откуда  Куда   Время отправления Время прибытия    Время в пути
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
Акнун биёед қадамҳои амалисозии намунаи худро гузарем:
  1. Интерфейсро муайян кунед, ки ба шумо имкон медиҳад ба ҷои an objectи аслӣ прокси навро истифода баред. Дар мисоли мо ин аст TimetableTrains.

  2. Синфи прокси эҷод кунед. Он бояд истинод ба an objectи хидматрасониро дар бар гирад (дар синф эҷод кунед ё дар конструктор гузаред);

    Ин аст синфи прокси мо:

    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;
       }
    }

    Дар ин марҳила, мо танҳо як синфро бо истинод ба an objectи аслӣ эҷод мекунем ва ҳама зангҳоро ба он интиқол медиҳем.

  3. Мо мантиқи синфи проксиро амалӣ мекунем. Асосан занг ҳамеша ба an objectи аслӣ равона карда мешавад.

    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;
       }
    }

    Ин усул getTimetable()месанҷад, ки оё массиви ҷадвал дар хотира кэш шудааст ё не. Дар акси ҳол, он дархост медиҳад, ки маълумотро аз диск бор карда, натиҷаро нигоҳ дорад. Агар дархост аллакай иҷро шуда бошад, он an objectро аз хотира зуд бармегардонад.

    Бо шарофати функсияҳои оддии худ, усули getTrainDepartireTime() набояд ба an objectи аслӣ равона карда шавад. Мо танҳо функсияи онро ба усули нав такрор кардем.

    Шумо ин корро карда наметавонед. Агар шумо бояд рамзро такрор кунед ё амалҳои шабеҳро иҷро кунед, ин маънои онро дорад, ки чизе хато кардааст ва шумо бояд ба мушкилот аз як паҳлӯи дигар назар кунед. Дар мисоли оддии мо роҳи дигар вуҷуд надорад, аммо дар лоиҳаҳои воқеӣ, эҳтимолан, code дурусттар навишта мешавад.

  4. Эҷоди an objectи аслиро дар codeи муштарӣ бо an objectи ивазкунанда иваз кунед:

    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]);
           }
       }
    }

    Имтиҳон

    
    Поезд  Откуда  Куда   Время отправления Время прибытия    Время в пути
    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

    Бузург, он дуруст кор мекунад.

    Шумо инчунин метавонед корхонаеро баррасӣ кунед, ки вобаста ба шароити муайян ҳам an objectи аслӣ ва ҳам an objectи ивазшавандаро эҷод кунад.

Истиноди муфид ба ҷои нуқта

  1. Мақолаи олӣ дар бораи намунаҳо ва каме дар бораи "Депутат"

Ин ҳама барои имрӯз аст! Хуб мешуд, ки ба омӯзиш баргардем ва донишҳои нави худро дар амал санҷед :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION