CodeGym /Java Blog /சீரற்ற /ப்ராக்ஸி வடிவமைப்பு முறை
John Squirrels
நிலை 41
San Francisco

ப்ராக்ஸி வடிவமைப்பு முறை

சீரற்ற குழுவில் வெளியிடப்பட்டது
நிரலாக்கத்தில், உங்கள் பயன்பாட்டின் கட்டமைப்பை சரியாக திட்டமிடுவது முக்கியம். வடிவமைப்பு வடிவங்கள் இதை நிறைவேற்ற ஒரு தவிர்க்க முடியாத வழி. இன்று ப்ராக்ஸிகளைப் பற்றி பேசலாம்.

உங்களுக்கு ஏன் ப்ராக்ஸி தேவை?

ஒரு பொருளுக்கான கட்டுப்படுத்தப்பட்ட அணுகலுடன் தொடர்புடைய சிக்கல்களைத் தீர்க்க இந்த முறை உதவுகிறது. "எங்களுக்கு ஏன் கட்டுப்படுத்தப்பட்ட அணுகல் தேவை?" என்று நீங்கள் கேட்கலாம். என்ன என்பதைக் கண்டுபிடிக்க உதவும் இரண்டு சூழ்நிலைகளைப் பார்ப்போம்.

எடுத்துக்காட்டு 1

எங்களிடம் பழைய குறியீட்டைக் கொண்ட ஒரு பெரிய திட்டம் உள்ளது என்று கற்பனை செய்து பாருங்கள், அங்கு தரவுத்தளத்திலிருந்து அறிக்கைகளை ஏற்றுமதி செய்வதற்கு ஒரு வகுப்பு பொறுப்பாகும். வகுப்பு ஒத்திசைவாக செயல்படுகிறது. அதாவது, தரவுத்தளமானது கோரிக்கையைச் செயல்படுத்தும் போது முழு அமைப்பும் செயலற்ற நிலையில் உள்ளது. சராசரியாக, ஒரு அறிக்கையை உருவாக்க 30 நிமிடங்கள் ஆகும். அதன்படி, ஏற்றுமதி செயல்முறை 12:30 AM இல் தொடங்குகிறது, மற்றும் நிர்வாகம் காலையில் அறிக்கையைப் பெறுகிறது. சாதாரண வேலை நேரத்தில் அறிக்கையை உடனடியாகப் பெறுவது நல்லது என்று தணிக்கையில் தெரியவந்துள்ளது. தொடக்க நேரத்தை ஒத்திவைக்க முடியாது, மேலும் தரவுத்தளத்திலிருந்து பதிலுக்காகக் காத்திருக்கும் போது கணினியைத் தடுக்க முடியாது. சிஸ்டம் எவ்வாறு இயங்குகிறது என்பதை மாற்றுவது, அறிக்கையை உருவாக்குவது மற்றும் ஒரு தனி நூலில் ஏற்றுமதி செய்வது தீர்வாகும். இந்த தீர்வு கணினியை வழக்கம் போல் செயல்பட அனுமதிக்கும், மேலும் நிர்வாகம் புதிய அறிக்கைகளைப் பெறும். எனினும், ஒரு சிக்கல் உள்ளது: தற்போதைய குறியீட்டை மீண்டும் எழுத முடியாது, ஏனெனில் கணினியின் மற்ற பகுதிகள் அதன் செயல்பாட்டைப் பயன்படுத்துகின்றன. இந்த வழக்கில், அறிக்கைகளை ஏற்றுமதி செய்வதற்கான கோரிக்கைகளைப் பெறுவதற்கும், தொடக்க நேரத்தைப் பதிவு செய்வதற்கும் மற்றும் ஒரு தனி நூலைத் தொடங்குவதற்கும் இடைநிலை ப்ராக்ஸி வகுப்பை அறிமுகப்படுத்த ப்ராக்ஸி வடிவத்தைப் பயன்படுத்தலாம். அறிக்கை உருவாக்கப்பட்டவுடன், நூல் முடிவடைகிறது மற்றும் அனைவருக்கும் மகிழ்ச்சி.

உதாரணம் 2

ஒரு மேம்பாட்டுக் குழு நிகழ்வுகளின் இணையதளத்தை உருவாக்குகிறது. புதிய நிகழ்வுகளின் தரவைப் பெற, குழு மூன்றாம் தரப்பு சேவையை வினவுகிறது. ஒரு சிறப்பு தனியார் நூலகம் சேவையுடன் தொடர்பு கொள்ள உதவுகிறது. வளர்ச்சியின் போது, ​​ஒரு சிக்கல் கண்டறியப்பட்டது: மூன்றாம் தரப்பு அமைப்பு அதன் தரவை ஒரு நாளுக்கு ஒருமுறை புதுப்பிக்கிறது, ஆனால் பயனர் ஒரு பக்கத்தைப் புதுப்பிக்கும் ஒவ்வொரு முறையும் ஒரு கோரிக்கை அனுப்பப்படும். இது அதிக எண்ணிக்கையிலான கோரிக்கைகளை உருவாக்குகிறது, மேலும் சேவை பதிலளிப்பதை நிறுத்துகிறது. சேவையின் பதிலைத் தேக்ககப்படுத்துவதும், பக்கங்கள் மீண்டும் ஏற்றப்படும்போது, ​​தற்காலிக சேமிப்பை பார்வையாளர்களுக்குத் திருப்பித் தருவதும், தேவைக்கேற்ப தற்காலிக சேமிப்பைப் புதுப்பிப்பதும் தீர்வாகும். இந்த வழக்கில், ப்ராக்ஸி வடிவமைப்பு முறை ஒரு சிறந்த தீர்வாகும், இது ஏற்கனவே உள்ள செயல்பாட்டை மாற்றாது.

வடிவமைப்பு முறையின் பின்னணியில் உள்ள கொள்கை

இந்த முறையை செயல்படுத்த, நீங்கள் ஒரு ப்ராக்ஸி வகுப்பை உருவாக்க வேண்டும். இது சேவை வகுப்பின் இடைமுகத்தை செயல்படுத்துகிறது, கிளையன்ட் குறியீட்டிற்கான அதன் நடத்தையைப் பிரதிபலிக்கிறது. இந்த முறையில், வாடிக்கையாளர் உண்மையான பொருளுக்கு பதிலாக ப்ராக்ஸியுடன் தொடர்பு கொள்கிறார். ஒரு விதியாக, அனைத்து கோரிக்கைகளும் சேவை வகுப்பிற்கு அனுப்பப்படுகின்றன, ஆனால் கூடுதல் செயல்களுடன் முன் அல்லது பின். எளிமையாகச் சொன்னால், ப்ராக்ஸி என்பது கிளையன்ட் குறியீடு மற்றும் இலக்கு பொருளுக்கு இடையே உள்ள அடுக்கு. பழைய மற்றும் மிகவும் மெதுவான ஹார்ட் டிஸ்க்கிலிருந்து வினவல் முடிவுகளை தேக்ககப்படுத்துவதற்கான உதாரணத்தைக் கவனியுங்கள். தர்க்கத்தை மாற்ற முடியாத சில பழங்கால பயன்பாட்டில் மின்சார ரயில்களுக்கான கால அட்டவணையைப் பற்றி பேசுகிறோம் என்று வைத்துக்கொள்வோம். புதுப்பிக்கப்பட்ட கால அட்டவணையுடன் கூடிய வட்டு ஒவ்வொரு நாளும் ஒரு குறிப்பிட்ட நேரத்தில் செருகப்படும். எனவே, எங்களிடம் உள்ளது:
  1. TrainTimetableஇடைமுகம்.
  2. ElectricTrainTimetable, இது இந்த இடைமுகத்தை செயல்படுத்துகிறது.
  3. கிளையன்ட் குறியீடு இந்த வகுப்பின் மூலம் கோப்பு முறைமையுடன் தொடர்பு கொள்கிறது.
  4. TimetableDisplayவாடிக்கையாளர் வர்க்கம். அதன் printTimetable()முறை வகுப்பின் முறைகளைப் பயன்படுத்துகிறது ElectricTrainTimetable.
வரைபடம் எளிதானது: ப்ராக்ஸி வடிவமைப்பு முறை: - 2தற்போது, ​​முறையின் ஒவ்வொரு அழைப்பிலும் printTimetable(), ElectricTrainTimetableவகுப்பு வட்டை அணுகுகிறது, தரவை ஏற்றுகிறது மற்றும் கிளையண்டிற்கு வழங்குகிறது. கணினி சரியாக வேலை செய்கிறது, ஆனால் அது மிகவும் மெதுவாக உள்ளது. இதன் விளைவாக, கேச்சிங் பொறிமுறையைச் சேர்ப்பதன் மூலம் கணினி செயல்திறனை அதிகரிக்க முடிவு செய்யப்பட்டது. ப்ராக்ஸி வடிவத்தைப் பயன்படுத்தி இதைச் செய்யலாம்: ப்ராக்ஸி வடிவமைப்பு முறை: - 3எனவே, பழைய வகுப்பிற்குப் பதிலாக வகுப்போடு TimetableDisplayதொடர்புகொள்வதை வகுப்பு கவனிக்கவில்லை . ElectricTrainTimetableProxyபுதிய அமலாக்கம் ஒரு நாளைக்கு ஒரு முறை கால அட்டவணையை ஏற்றுகிறது. மீண்டும் மீண்டும் கோரிக்கைகளுக்கு, நினைவகத்திலிருந்து முன்பு ஏற்றப்பட்ட பொருளை இது வழங்கும்.

ப்ராக்ஸிக்கு என்ன பணிகள் சிறந்தது?

இந்த முறை நிச்சயமாக கைக்கு வரும் சில சூழ்நிலைகள் இங்கே:
  1. கேச்சிங்
  2. தாமதம், அல்லது சோம்பேறி, துவக்கம் தேவைக்கேற்ப ஒரு பொருளை ஏற்ற முடிந்தால் ஏன் உடனே ஏற்ற வேண்டும்?
  3. பதிவு கோரிக்கைகள்
  4. தரவு மற்றும் அணுகலின் இடைநிலை சரிபார்ப்பு
  5. தொழிலாளி நூல்களைத் தொடங்குதல்
  6. ஒரு பொருளுக்கான அணுகலை பதிவு செய்தல்
மற்றும் பிற பயன்பாட்டு வழக்குகளும் உள்ளன. இந்த முறையின் பின்னணியில் உள்ள கொள்கையைப் புரிந்துகொள்வதன் மூலம், அதை வெற்றிகரமாகப் பயன்படுத்தக்கூடிய சூழ்நிலைகளை நீங்கள் அடையாளம் காணலாம். முதல் பார்வையில், ஒரு ப்ராக்ஸி முகப்பைப் போலவே செய்கிறது , ஆனால் அது அப்படியல்ல. ஒரு ப்ராக்ஸி சேவை பொருளின் அதே இடைமுகத்தைக் கொண்டுள்ளது. மேலும், இந்த வடிவத்தை டெக்கரேட்டர் அல்லது அடாப்டர் பேட்டர்ன்களுடன் குழப்ப வேண்டாம் . ஒரு அலங்கரிப்பாளர் நீட்டிக்கப்பட்ட இடைமுகத்தை வழங்குகிறது, மேலும் அடாப்டர் மாற்று இடைமுகத்தை வழங்குகிறது.

நன்மைகள் மற்றும் தீமைகள்

  • + நீங்கள் விரும்பியபடி சேவைப் பொருளுக்கான அணுகலைக் கட்டுப்படுத்தலாம்
  • + சேவைப் பொருளின் வாழ்க்கைச் சுழற்சியை நிர்வகிப்பது தொடர்பான கூடுதல் திறன்கள்
  • + இது சேவை பொருள் இல்லாமல் வேலை செய்கிறது
  • + இது செயல்திறன் மற்றும் குறியீடு பாதுகாப்பை மேம்படுத்துகிறது.
  • - கூடுதல் கோரிக்கைகள் காரணமாக செயல்திறன் மோசமாகும் அபாயம் உள்ளது
  • - இது வர்க்கப் படிநிலையை மிகவும் சிக்கலாக்குகிறது

நடைமுறையில் உள்ள ப்ராக்ஸி முறை

ஹார்ட் டிஸ்க்கில் இருந்து ரயில் கால அட்டவணையைப் படிக்கும் முறையை செயல்படுத்துவோம்:

public interface TrainTimetable {
   String[] getTimetable();
   String getTrainDepartureTime();
}
முக்கிய இடைமுகத்தை செயல்படுத்தும் வகுப்பு இங்கே:

public class ElectricTrainTimetable implements TrainTimetable {

   @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 "";
   }
}
ஒவ்வொரு முறையும் நீங்கள் ரயில் கால அட்டவணையைப் பெறும்போது, ​​நிரல் வட்டில் இருந்து ஒரு கோப்பைப் படிக்கும். ஆனால் அதுதான் எங்கள் பிரச்சனைகளின் ஆரம்பம். ஒரு ரயிலுக்கான கால அட்டவணையைப் பெறும் ஒவ்வொரு முறையும் முழு கோப்பும் படிக்கப்படுகிறது! என்ன செய்யக்கூடாது என்பதற்கான எடுத்துக்காட்டுகளில் மட்டுமே அத்தகைய குறியீடு இருப்பது நல்லது :) கிளையன்ட் வகுப்பு:

public class TimetableDisplay {
   private TrainTimetable trainTimetable = new ElectricTrainTimetable();

   public void printTimetable() {
       String[] timetable = trainTimetable.getTimetable();
       String[] tmpArr;
       System.out.println("Train\\tFrom\\tTo\\t\\tDeparture time\\tArrival time\\tTravel time");
       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;London;Prague;13:43;21:15;07:32
BA-1404;Paris;Graz;14:25;21:25;07:00
9B-8710;Prague;Vienna;04:48;08:49;04:01;
9B-8122;Prague;Graz;04:48;08:49;04:01
அதை சோதிப்போம்:

public static void main(String[] args) {
   TimetableDisplay timetableDisplay = new timetableDisplay();
   timetableDisplay.printTimetable();
}
வெளியீடு:

Train  From  To  Departure time  Arrival time  Travel time
9B-6854  London  Prague  13:43  21:15  07:32
BA-1404  Paris  Graz  14:25  21:25  07:00
9B-8710  Prague  Vienna  04:48  08:49  04:01
9B-8122  Prague  Graz  04:48  08:49  04:01
இப்போது எங்கள் வடிவத்தை அறிமுகப்படுத்த தேவையான படிகள் மூலம் நடப்போம்:
  1. அசல் பொருளுக்குப் பதிலாக ப்ராக்ஸியைப் பயன்படுத்த அனுமதிக்கும் இடைமுகத்தை வரையறுக்கவும். எங்கள் எடுத்துக்காட்டில், இது TrainTimetable.

  2. ப்ராக்ஸி வகுப்பை உருவாக்கவும். இது சேவைப் பொருளைப் பற்றிய குறிப்பைக் கொண்டிருக்க வேண்டும் (அதை வகுப்பில் உருவாக்கவும் அல்லது கட்டமைப்பாளரிடம் அனுப்பவும்).

    இதோ எங்கள் ப்ராக்ஸி வகுப்பு:

    
    public class ElectricTrainTimetableProxy implements TrainTimetable {
       // Reference to the original object
       private TrainTimetable trainTimetable = new ElectricTrainTimetable();
      
       private String[] timetableCache = null
    
       @Override
       public String[] getTimetable() {
           return trainTimetable.getTimetable();
       }
    
       @Override
       public String getTrainDepartureTime(String trainId) {
           return trainTimetable.getTrainDepartureTime(trainId);
       }
      
       public void clearCache() {
           trainTimetable = null;
       }
    }
    

    இந்த கட்டத்தில், அசல் பொருளின் குறிப்புடன் ஒரு வகுப்பை உருவாக்கி, எல்லா அழைப்புகளையும் அதற்கு அனுப்புகிறோம்.

  3. ப்ராக்ஸி வகுப்பின் தர்க்கத்தை செயல்படுத்துவோம். அடிப்படையில், அழைப்புகள் எப்போதும் அசல் பொருளுக்கு திருப்பி விடப்படும்.

    
    public class ElectricTrainTimetableProxy implements TrainTimetable {
       // Reference to the original object
       private TrainTimetable trainTimetable = new ElectricTrainTimetable();
    
       private String[] timetableCache = null
    
       @Override
       public String[] getTimetable() {
           if (timetableCache == null) {
               timetableCache = trainTimetable.getTimetable();
           }
           return timetableCache;
       }
    
       @Override
       public String getTrainDepartureTime(String trainId) {
           if (timetableCache == null) {
               timetableCache = trainTimetable.getTimetable();
           }
           for (int i = 0; i < timetableCache.length; i++) {
               if (timetableCache[i].startsWith(trainId+";")) return timetableCache[i];
           }
           return "";
       }
    
       public void clearCache() {
           trainTimetable = null;
       }
    }
    

    getTimetable()கால அட்டவணை வரிசை நினைவகத்தில் தற்காலிகமாக சேமிக்கப்பட்டுள்ளதா என்பதை சரிபார்க்கிறது . இல்லையெனில், வட்டில் இருந்து தரவை ஏற்றுவதற்கான கோரிக்கையை அனுப்புகிறது மற்றும் முடிவைச் சேமிக்கிறது. கால அட்டவணை ஏற்கனவே கோரப்பட்டிருந்தால், அது விரைவாக நினைவகத்திலிருந்து பொருளைத் திரும்பப் பெறுகிறது.

    அதன் எளிய செயல்பாட்டிற்கு நன்றி, getTrainDepartureTime() முறையை அசல் பொருளுக்கு திருப்பிவிட வேண்டியதில்லை. அதன் செயல்பாட்டை ஒரு புதிய முறையில் நகல் செய்துள்ளோம்.

    இதை செய்யாதே. நீங்கள் குறியீட்டை நகலெடுக்க வேண்டும் அல்லது இதேபோன்ற ஒன்றைச் செய்ய வேண்டும் என்றால், ஏதோ தவறு நடந்துவிட்டது, மேலும் நீங்கள் சிக்கலை வேறு கோணத்தில் பார்க்க வேண்டும். எங்கள் எளிய உதாரணத்தில், எங்களுக்கு வேறு வழியில்லை. ஆனால் உண்மையான திட்டங்களில், குறியீடு பெரும்பாலும் சரியாக எழுதப்படும்.

  4. கிளையன்ட் குறியீட்டில், அசல் பொருளுக்கு பதிலாக ப்ராக்ஸி பொருளை உருவாக்கவும்:

    
    public class TimetableDisplay {
       // Changed reference
       private TrainTimetable trainTimetable = new ElectricTrainTimetableProxy();
    
       public void printTimetable() {
           String[] timetable = trainTimetable.getTimetable();
           String[] tmpArr;
           System.out.println("Train\\tFrom\\tTo\\t\\tDeparture time\\tArrival time\\tTravel time");
           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]);
           }
       }
    }
    

    காசோலை

    
    Train  From  To  Departure time  Arrival time  Travel time
    9B-6854  London  Prague  13:43  21:15  07:32
    BA-1404  Paris  Graz  14:25  21:25  07:00
    9B-8710  Prague  Vienna  04:48  08:49  04:01
    9B-8122  Prague  Graz  04:48  08:49  04:01
    

    நல்லது, அது சரியாக வேலை செய்கிறது.

    சில நிபந்தனைகளைப் பொறுத்து அசல் பொருள் மற்றும் ப்ராக்ஸி பொருள் இரண்டையும் உருவாக்கும் தொழிற்சாலையின் விருப்பத்தையும் நீங்கள் பரிசீலிக்கலாம்.

விடைபெறுவதற்கு முன், இங்கே ஒரு பயனுள்ள இணைப்பு உள்ளது

இன்னைக்கு அவ்வளவுதான்! பாடங்களுக்குத் திரும்பி உங்கள் புதிய அறிவை நடைமுறையில் முயற்சிப்பது மோசமான யோசனையாக இருக்காது :)
கருத்துக்கள்
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION