#!/usr/bin/env python3 import abc class Strategy(metaclass=abc.ABCMeta): @abc.abstractmethod def check_temperature(self, temperature): pass class HikeStrategy(Strategy): def check_temperature(self, temperature): if temperature >= 20 and temperature <= 40: return True else: return False class SkiStrategy(Strategy): def check_temperature(self, temperature): if temperature <= 0: return True else: return False class Context: def __init__(self, temperature, strategy, action_name): self.temperature = temperature self.strategy = strategy self.action_name = action_name def output_result(self): print('temperature: ' + str(self.temperature)) print('action name: ' + str(self.action_name)) print('result: ' + str(self.strategy.check_temperature(self.temperature)), end='\n\n') if __name__ == '__main__': context = Context(25, SkiStrategy(), 'ski') context.output_result() context = Context(25, HikeStrategy(), 'hike') context.output_result() context = Context(-20, SkiStrategy(), 'ski') context.output_result() context = Context(-20, HikeStrategy(), 'hike') context.output_result()
смущает меня то, что при создании экземпляра класс Context() я явно передаю конкретные вид стратегии. например так:
context = Context(25, SkiStrategy(), 'ski')
это нормально, как думаете? нельзя ли использовать более универсальный способ?
LIVE DEMO здесь: https://ideone.com/hLhUHV