Форум сайта python.su
0
ребята, помогите пожалуйста разобраться с паттерном “стратегия”. я написал некоторую его реализацию, но сомневаюсь, что она правильная:
#!/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(25, SkiStrategy(), 'ski')
Отредактировано zlodiak (Фев. 3, 2019 13:38:14)
Офлайн
294
zlodiakну не то чтобы совсем неправильная…
я написал некоторую его реализацию, но сомневаюсь, что она правильная:
class Strategy(): def go(self, name, hobby): raise NotImplementedError('This is abstrackt method!!') class HikeStrategy(Strategy): def go(self, name, hobby): print('{} {} идет в поход'.format(hobby, name)) class SkiStrategy(Strategy): def go(self, name, hobby): print('{} {} идет кататься на лыжах'.format(hobby, name)) class Context: hobby = 'обыватель' def __init__(self, name): self.name = name self.strategy = Strategy() def use_strategy(self): self.strategy.go(self.name, self.hobby) def set_strategy(self, strategy): self.strategy = strategy class Hiker(Context): hobby = 'турист' def __init__(self, name): self.name = name self.strategy = HikeStrategy() class Skier(Context): hobby = 'лыжник' def __init__(self, name): self.name = name self.strategy = SkiStrategy() if __name__ == '__main__': Bill = Hiker('Вася') Bill.use_strategy() John = Skier('Петя') John.use_strategy() John.set_strategy(HikeStrategy()) John.use_strategy() >>> турист Вася идет в поход лыжник Петя идет кататься на лыжах лыжник Петя идет в поход >>>
zlodiakДа вобщемто нет, это в принципе допускаеться.
смущает меня то, что при создании экземпляра класс Context() я явно передаю конкретные вид стратегии.
[code python][/code]
Отредактировано PEHDOM (Фев. 4, 2019 10:00:31)
Офлайн