Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 3, 2019 13:00:45

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  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 = Context(25, SkiStrategy(), 'ski')

это нормально, как думаете? нельзя ли использовать более универсальный способ?


LIVE DEMO здесь: https://ideone.com/hLhUHV

Отредактировано zlodiak (Фев. 3, 2019 13:38:14)

Офлайн

#2 Фев. 3, 2019 13:59:41

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

паттерн Стратегия: поход или лыжи

zlodiak
я написал некоторую его реализацию, но сомневаюсь, что она правильная:
ну не то чтобы совсем неправильная…
Стратегия — поведенческий шаблон проектирования, предназначенный для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Это позволяет выбирать алгоритм путём определения соответствующего класса. Шаблон Strategy позволяет менять выбранный алгоритм независимо от объектов-клиентов, которые его используют. Насколько я понимаю этот шаблон то оно должно выглятеть примерно так:
 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version