From 8a7dfa0972c83fd811a4296e7373574bea4a28d0 Mon Sep 17 00:00:00 2001 From: Nguyễn Gia Phong Date: Sun, 19 Jul 2020 20:34:40 +0700 Subject: [usth/ICT2.7] Remove Udacity transcribes --- ...rategy Pattern Example & Demo - lang_en_vs5.srt | 511 --------------------- 1 file changed, 511 deletions(-) delete mode 100644 usth/ICT2.7/P3L3 Design Patterns Subtitles/8 - Strategy Pattern Example & Demo - lang_en_vs5.srt (limited to 'usth/ICT2.7/P3L3 Design Patterns Subtitles/8 - Strategy Pattern Example & Demo - lang_en_vs5.srt') diff --git a/usth/ICT2.7/P3L3 Design Patterns Subtitles/8 - Strategy Pattern Example & Demo - lang_en_vs5.srt b/usth/ICT2.7/P3L3 Design Patterns Subtitles/8 - Strategy Pattern Example & Demo - lang_en_vs5.srt deleted file mode 100644 index 6d298d0..0000000 --- a/usth/ICT2.7/P3L3 Design Patterns Subtitles/8 - Strategy Pattern Example & Demo - lang_en_vs5.srt +++ /dev/null @@ -1,511 +0,0 @@ -1 -00:00:00,130 --> 00:00:03,320 -Now let's see how this whole thing works in practice by - -2 -00:00:03,320 --> 00:00:06,800 -using an example. We're going to consider a program that takes as - -3 -00:00:06,800 --> 00:00:10,450 -input a text file and produce it as output, a filtered - -4 -00:00:10,450 --> 00:00:14,170 -file. So basically it outputs a subset of the content of - -5 -00:00:14,170 --> 00:00:16,928 -this text file based on some filter. And we're going to have - -6 -00:00:16,928 --> 00:00:19,440 -four different types of filters. So the first one is - -7 -00:00:19,440 --> 00:00:21,680 -not filtering which means that the whole content of the text - -8 -00:00:21,680 --> 00:00:25,320 -file will be produced on the output. The second filter will output - -9 -00:00:25,320 --> 00:00:27,990 -only words that starts with t. So you'll take the text file - -10 -00:00:27,990 --> 00:00:30,540 -and simply ignore all of the words that do not start with - -11 -00:00:30,540 --> 00:00:33,130 -t. So in the output we'll have only those words that starts - -12 -00:00:33,130 --> 00:00:36,030 -with letter t. The third filter will produce in the output only - -13 -00:00:36,030 --> 00:00:39,180 -words that are longer than five characters. So all the other words - -14 -00:00:39,180 --> 00:00:43,740 -will be simply disregarded. And finally, the four filter will produce as - -15 -00:00:43,740 --> 00:00:47,630 -output only words in the text file that are palindromes, and in - -16 -00:00:47,630 --> 00:00:50,590 -case you don't know what a palindrome is, a palindrome is a word - -17 -00:00:50,590 --> 00:00:52,700 -that is the same whether you read it from left - -18 -00:00:52,700 --> 00:00:55,800 -to right or from right to left. For example, the - -19 -00:00:55,800 --> 00:00:58,480 -word kayak, you can read it in this direction, or - -20 -00:00:58,480 --> 00:01:00,740 -in this direction, and it's exactly the same word. So - -21 -00:01:00,740 --> 00:01:03,560 -let's see how this program could be implemented using a - -22 -00:01:03,560 --> 00:01:05,980 -strategy pattern. And let's do it for real as a - -23 -00:01:05,980 --> 00:01:10,100 -demo. What we're looking at here is the editor page - -24 -00:01:10,100 --> 00:01:15,520 -for Eclipse, open with the strategy pattern implementation for our example. - -25 -00:01:15,520 --> 00:01:17,130 -So what I'm going to do is that, I'm going to look at a - -26 -00:01:17,130 --> 00:01:20,310 -different part of implementation. And you will see that, you know, despite - -27 -00:01:20,310 --> 00:01:23,420 -the fact that it's slightly longer, it's really fairly simple, it's kind - -28 -00:01:23,420 --> 00:01:26,230 -of a straightforward implementation of what we just saw. As I just - -29 -00:01:26,230 --> 00:01:29,820 -said, what we are doing is basically building the strategy patterns that - -30 -00:01:29,820 --> 00:01:34,330 -allows for changing the strategies with which we're filtering an input file. - -31 -00:01:34,330 --> 00:01:37,380 -And we have different strategies, we'll look at those in detail, and - -32 -00:01:37,380 --> 00:01:41,050 -we said that the three participants for this pattern are the context, - -33 -00:01:41,050 --> 00:01:43,650 -the algorithm, which is the general interface and then the concrete - -34 -00:01:43,650 --> 00:01:47,270 -strategies, which are the concrete implementations of this algorithm. So let's - -35 -00:01:47,270 --> 00:01:49,790 -start by looking at the context. Which is this class here. - -36 -00:01:49,790 --> 00:01:52,960 -And as you can see it contains a reference at the current - -37 -00:01:52,960 --> 00:01:56,240 -strategy. We call this the check strategy, which is basically our - -38 -00:01:56,240 --> 00:01:59,910 -filter, and when the context is created by default it sets a - -39 -00:01:59,910 --> 00:02:02,890 -strategy to the old strategy. The old strategy is the one - -40 -00:02:02,890 --> 00:02:06,380 -that accepts all the input, so basically it doesn't filter out anything. - -41 -00:02:06,380 --> 00:02:08,320 -And we said that the context is the interface to the - -42 -00:02:08,320 --> 00:02:10,889 -outside world, right? So it has to provide the outside world - -43 -00:02:10,889 --> 00:02:14,140 -with a way of selecting the strategy, the specific algorithm to - -44 -00:02:14,140 --> 00:02:16,850 -be used, and it does that in this case by providing - -45 -00:02:16,850 --> 00:02:21,360 -this change strategy method. This method takes a strategy as input, - -46 -00:02:21,360 --> 00:02:24,930 -and simply replaces the current strategy with the one specified as - -47 -00:02:24,930 --> 00:02:28,035 -a parameter. And at this point, the context also will perform - -48 -00:02:28,035 --> 00:02:31,830 -the filtering. The filtering is pretty straightforward, so what it does is - -49 -00:02:31,830 --> 00:02:34,620 -that it opens a file that is passed as a parameter - -50 -00:02:34,620 --> 00:02:37,450 -so that this the file, the input file to be filtered. And - -51 -00:02:37,450 --> 00:02:40,560 -then it reads the file line by line and then splits - -52 -00:02:40,560 --> 00:02:43,620 -the lines into its composing words and then for each word in - -53 -00:02:43,620 --> 00:02:46,480 -each line, what it will do, it will basically invoke the - -54 -00:02:46,480 --> 00:02:50,270 -check method in the current strategy, which is basically the filtering method - -55 -00:02:50,270 --> 00:02:53,580 -and if the check method returns true, which basically means that - -56 -00:02:53,580 --> 00:02:57,150 -the word should be printed, it prints the word. Otherwise, it'll just - -57 -00:02:57,150 --> 00:03:00,480 -skip it. So basically the filter will return false for all the - -58 -00:03:00,480 --> 00:03:03,470 -words that have to be filtered out. Okay? This is the basic - -59 -00:03:03,470 --> 00:03:06,770 -way in which context works. Let's see how this is used in - -60 -00:03:06,770 --> 00:03:10,660 -our main method. The main method simply creates the context, reads the input file - -61 -00:03:10,660 --> 00:03:12,910 -from the arguments, and then what he does is simply as a - -62 -00:03:12,910 --> 00:03:16,720 -demonstration, it will perform the filtering using all the different filters. So - -63 -00:03:16,720 --> 00:03:19,310 -starting from the default one, which is the one that basically doesn't - -64 -00:03:19,310 --> 00:03:22,150 -do any filtering that reports all words, then it will switch to the - -65 -00:03:22,150 --> 00:03:25,400 -algorithm, that only considers the words that start with t, and - -66 -00:03:25,400 --> 00:03:28,880 -it will do that by invoking a change strategy and passing this - -67 -00:03:28,880 --> 00:03:30,890 -strategy as the argument, and then - -68 -00:03:30,890 --> 00:03:32,760 -performing the actual filtering through context. - -69 -00:03:32,760 --> 00:03:35,040 -And it will do exactly the same for the strategy that only - -70 -00:03:35,040 --> 00:03:37,540 -prints words that are longer than five and the one that - -71 -00:03:37,540 --> 00:03:40,460 -only prints words that are palindromes. So now let's look at the - -72 -00:03:40,460 --> 00:03:44,090 -actual algorithm. This is the interface, the algorithm interface. And you can - -73 -00:03:44,090 --> 00:03:47,080 -see that the only thing that the interface provides is this method, - -74 -00:03:47,080 --> 00:03:49,760 -which is the check method, that takes a string as input and will - -75 -00:03:49,760 --> 00:03:52,470 -return a boolean. So, basically, it's the boolean that we were seeing before. - -76 -00:03:52,470 --> 00:03:55,010 -The one that is true for the words that have to be printed - -77 -00:03:55,010 --> 00:03:57,490 -and false for the ones that have to be filtered out. Now, we have - -78 -00:03:57,490 --> 00:04:01,250 -all the different implementations of the algorithm, the simplest one is the all - -79 -00:04:01,250 --> 00:04:05,110 -algorithm, the simple return is always true, so all the words will be printed. - -80 -00:04:05,110 --> 00:04:08,740 -The second one starts with t, and again, without looking at the details - -81 -00:04:08,740 --> 00:04:10,660 -of implementations that don't really matter, what - -82 -00:04:10,660 --> 00:04:12,390 -it does is basically check that - -83 -00:04:12,390 --> 00:04:15,111 -the first character is t, and returns true in that case and - -84 -00:04:15,111 --> 00:04:17,720 -false otherwise. Similarly, for the LongerThan5 - -85 -00:04:17,720 --> 00:04:19,380 -algorithm, also in this case, this - -86 -00:04:19,380 --> 00:04:23,000 -will implement the check strategy interface, and the check will be performed - -87 -00:04:23,000 --> 00:04:25,980 -by checking that the word is longer than five characters and returning - -88 -00:04:25,980 --> 00:04:29,440 -true in that case and false otherwise. And finally the Palindrome check - -89 -00:04:29,440 --> 00:04:32,240 -is a little more complicated, but basically it just checks whether the - -90 -00:04:32,240 --> 00:04:35,190 -word is a Palindrome and returns true in that case. Okay, so - -91 -00:04:35,190 --> 00:04:37,950 -as I said, it doesn't really matter too much what is the specific - -92 -00:04:37,950 --> 00:04:40,630 -implementations of these matters. What matters is that we have - -93 -00:04:40,630 --> 00:04:44,150 -a general interface for the algorithm and then any different concrete - -94 -00:04:44,150 --> 00:04:48,130 -implementations of the algorithm that implement different strategies. So again, - -95 -00:04:48,130 --> 00:04:50,730 -this allows you to change the behavior of your class without - -96 -00:04:50,730 --> 00:04:53,420 -changing class. So we have this context class that does - -97 -00:04:53,420 --> 00:04:57,015 -different things when the filter method in invoked, depending on what - -98 -00:04:57,015 --> 00:04:59,930 -is the current strategy. So the behavior of the class can - -99 -00:04:59,930 --> 00:05:03,310 -change dynamically, and it changes dynamically every time that we change - -100 -00:05:03,310 --> 00:05:06,300 -the strategy. At this point, the way this whole thing works should - -101 -00:05:06,300 --> 00:05:08,430 -be clear, so what we're going to do is that we're going to go to - -102 -00:05:08,430 --> 00:05:12,010 -our console, and we're actually going to run the strategy pattern and see - -103 -00:05:12,010 --> 00:05:15,710 -what happens. So here I have a file, it's called foo.txt. And if - -104 -00:05:15,710 --> 00:05:18,290 -we look at the content of foo, you can see that it - -105 -00:05:18,290 --> 00:05:21,190 -says that this is just a test to assess how well this program - -106 -00:05:21,190 --> 00:05:24,430 -performs when used on files of text. And since it checks for - -107 -00:05:24,430 --> 00:05:28,560 -palindromes, we will also insert one such word, level. Level is a palindrome, - -108 -00:05:28,560 --> 00:05:31,042 -because you can read it from both sides. Okay, so let's - -109 -00:05:31,042 --> 00:05:33,657 -see what happens when we run our code. So we're going to - -110 -00:05:33,657 --> 00:05:36,900 -run java pattern.strategy.StrategyPattern which is - -111 -00:05:36,900 --> 00:05:38,550 -our class, and we going to fetch - -112 -00:05:38,550 --> 00:05:41,460 -foo.txt as an input, and let's go back to the beginning - -113 -00:05:41,460 --> 00:05:43,980 -of the output to see what happened exactly. You can see - -114 -00:05:43,980 --> 00:05:48,040 -here that for the default strategy, which was the old strategy, - -115 -00:05:48,040 --> 00:05:50,810 -the whole file is printed, so every word is printed. This - -116 -00:05:50,810 --> 00:05:53,485 -is just a test to assess and so on and so forth, - -117 -00:05:53,485 --> 00:05:57,290 -as expected. For the filter that only prints words that - -118 -00:05:57,290 --> 00:06:00,230 -start with t, only words that start with t are printed, - -119 -00:06:00,230 --> 00:06:04,180 -again, as expected. Similarly, for the filter that only prints words - -120 -00:06:04,180 --> 00:06:06,970 -that are longer than 5, and finally for the one that prints - -121 -00:06:06,970 --> 00:06:09,540 -palindromes. And here you can see that we actually have two - -122 -00:06:09,540 --> 00:06:12,410 -because the way in which this is implemented we'll also consider - -123 -00:06:12,410 --> 00:06:15,300 -single letter words as palindromes because you can read them from - -124 -00:06:15,300 --> 00:06:18,450 -both sides. But you definitely will also have level in the output. - -125 -00:06:18,450 --> 00:06:21,040 -And in case you want to play with this code yourself, I - -126 -00:06:21,040 --> 00:06:24,600 -have made this code and also the implementation for examples of other - -127 -00:06:24,600 --> 00:06:28,440 -design partners available as a compressed archive. And the archive is accessible - -128 -00:06:28,440 --> 00:06:31,120 -through a URL that is provided in the notes for the cost. -- cgit 1.4.1