|
@@ -1,36 +1,40 @@
|
|
-"""http://stackoverflow.com/questions/963965/how-is-this-strategy-pattern-written-in-python-the-sample-in-wikipedia"""
|
|
|
|
|
|
+"""http://stackoverflow.com/questions/963965/how-is-this-strategy-pattern-written-in-python-the-sample-in-wikipedia
|
|
|
|
|
|
-import types
|
|
|
|
|
|
+In most of other languages Strategy pattern is implemented via creating some base strategy interface/abstract class and
|
|
|
|
+subclassing it with a number of concrete strategies (as we can see at http://en.wikipedia.org/wiki/Strategy_pattern),
|
|
|
|
+however Python supports higher-order functions and allows us to have only one class and inject functions into it's
|
|
|
|
+instances, as shown in this example.
|
|
|
|
+"""
|
|
|
|
+import types
|
|
|
|
|
|
|
|
|
|
class StrategyExample:
|
|
class StrategyExample:
|
|
-
|
|
|
|
- def __init__(self, func=None):
|
|
|
|
- self.name = "Strategy Example 0"
|
|
|
|
- if func:
|
|
|
|
|
|
+ def __init__(self, func=None):
|
|
|
|
+ self.name = 'Strategy Example 0'
|
|
|
|
+ if func is not None:
|
|
self.execute = types.MethodType(func, self)
|
|
self.execute = types.MethodType(func, self)
|
|
|
|
|
|
def execute(self):
|
|
def execute(self):
|
|
print(self.name)
|
|
print(self.name)
|
|
|
|
|
|
|
|
|
|
-def executeReplacement1(self):
|
|
|
|
- print(self.name + " from execute 1")
|
|
|
|
|
|
+def execute_replacement1(self):
|
|
|
|
+ print(self.name + ' from execute 1')
|
|
|
|
|
|
|
|
|
|
-def executeReplacement2(self):
|
|
|
|
- print(self.name + " from execute 2")
|
|
|
|
|
|
+def execute_replacement2(self):
|
|
|
|
+ print(self.name + ' from execute 2')
|
|
|
|
|
|
|
|
|
|
-if __name__ == "__main__":
|
|
|
|
|
|
+if __name__ == '__main__':
|
|
strat0 = StrategyExample()
|
|
strat0 = StrategyExample()
|
|
|
|
|
|
- strat1 = StrategyExample(executeReplacement1)
|
|
|
|
- strat1.name = "Strategy Example 1"
|
|
|
|
|
|
+ strat1 = StrategyExample(execute_replacement1)
|
|
|
|
+ strat1.name = 'Strategy Example 1'
|
|
|
|
|
|
- strat2 = StrategyExample(executeReplacement2)
|
|
|
|
- strat2.name = "Strategy Example 2"
|
|
|
|
|
|
+ strat2 = StrategyExample(execute_replacement2)
|
|
|
|
+ strat2.name = 'Strategy Example 2'
|
|
|
|
|
|
- strat0.execute()
|
|
|
|
|
|
+ strat0.execute()
|
|
strat1.execute()
|
|
strat1.execute()
|
|
strat2.execute()
|
|
strat2.execute()
|