1 00:00:00,230 --> 00:00:02,110 The second pattern I want to discuss is the 2 00:00:02,110 --> 00:00:05,050 strategy pattern, which provides a way to configure a 3 00:00:05,050 --> 00:00:07,900 class with one of many behaviors. What does that 4 00:00:07,900 --> 00:00:11,040 mean? Well, more precisely, this pattern allows for defining 5 00:00:11,040 --> 00:00:15,330 a family of algorithms, encapsulating them into separate classes, 6 00:00:15,330 --> 00:00:17,900 so each algorithm in one class, and making these 7 00:00:17,900 --> 00:00:21,490 classes interchangeable, but providing a common interface for all 8 00:00:21,490 --> 00:00:25,350 the encapsulated algorithms. So in essence, the intent of 9 00:00:25,350 --> 00:00:29,250 a strategy pattern is to allow for switching between 10 00:00:29,250 --> 00:00:33,490 different algorithms for accomplishing a given task. For example, imagine 11 00:00:33,490 --> 00:00:36,610 having different sorting algorithms with different space or time 12 00:00:36,610 --> 00:00:38,800 tradeoffs. You might want to be able to have them 13 00:00:38,800 --> 00:00:42,670 all available and use different ones in different situations. 14 00:00:42,670 --> 00:00:44,820 And this pattern is applicable not only when we have 15 00:00:44,820 --> 00:00:47,260 different variants of an algorithm, but also when we 16 00:00:47,260 --> 00:00:51,690 have many related classes that differ only in their behavior. 17 00:00:51,690 --> 00:00:53,640 So let's get more concrete and see how this is 18 00:00:53,640 --> 00:00:55,960 done. And I'm going to do it as before, by 19 00:00:55,960 --> 00:00:59,700 discussing the structure and the participants for this strategy pattern. 20 00:00:59,700 --> 00:01:02,540 In this case, we have 3 types of participants for this 21 00:01:02,540 --> 00:01:07,210 pattern, the context, the algorithm, and the concrete strategies. There 22 00:01:07,210 --> 00:01:09,580 can be as many as the number of behaviors that 23 00:01:09,580 --> 00:01:12,300 I need to implement. So, let's see what those are. 24 00:01:12,300 --> 00:01:16,690 The context is the interface to the outside world. It maintains 25 00:01:16,690 --> 00:01:19,180 a reference to the current algorithm and allows for 26 00:01:19,180 --> 00:01:22,860 updating this reference at run time. So, basically the outside 27 00:01:22,860 --> 00:01:26,370 world will invoke the functionality provided by the different algorithms, 28 00:01:26,370 --> 00:01:29,170 by using this interface. And depending on which algorithm is 29 00:01:29,170 --> 00:01:31,640 currently selected, that's the one that will be executed when 30 00:01:31,640 --> 00:01:35,920 the functionality is involved. The algorithm, also called the strategy, 31 00:01:35,920 --> 00:01:37,970 so that's where the pattern gets its name, Is the 32 00:01:37,970 --> 00:01:42,130 common interface for the different algorithims. So all the algorithms 33 00:01:42,130 --> 00:01:46,690 implement this interface. Finally, the concrete strategies are the 34 00:01:46,690 --> 00:01:49,920 actual implementations of the algorithms. So if I have 10 35 00:01:49,920 --> 00:01:53,030 different variants of my algorithm, I will implement 10 different 36 00:01:53,030 --> 00:01:56,550 concrete strategies. They will all be implementations of this interface.