Паттерн Стратегия. Паттерн Стратегия. Паттерн Стратегия.

Паттерн Стратегия.

Open in new window

Паттерн Стратегия.

Задача.

Создать игру “Зоопарк” в котором все звери могут издавать определенные звуки, ходить и быть отрисованными на экране.

Создадим класс animal, в котором определим три метода и одно свойство.

class animal(object):

    sound = 'uuuuuuuuuuuuu!'
    def say(self):
        print self.sound

    def move(self):
        print 'I go a head!'

    def display(self):
        print '''##########DISPLAY########'''

От него унаследуем пустой класс cat.

class cat(animal):
    pass

Теперь допустим что возникла необходимость добавить зверям дополнительную функцию полета.

Нет ничего проще добавить эту функцию в базовый класс.

class animal(object):

    sound = 'uuuuuuuuuuuuu!'
    def say(self):
        print self.sound

    def move(self):
        print 'I go a head!'

    def display(self):
        print '''##########DISPLAY########'''

    def fly(self):
        print 'I can fly'

Но при таком подходе все звери получат такую возможность. Даже те, которые летать не должны.

Чтоб исправить положение, можно переопределять метод fly там, где он неуместен.

class bird(animal):
    def display(self):
        print "-------DISPLAY BIRD--------"
    def fly(self):
        print 'I can fly'

class cat(animal):
    def fly(self):
        print 'Oups I can not fly!'

if __name__ == "__main__":
    o1 = cat()
    o1.display()
    o1.say()
    o1.move()
    o1.fly()

Такой подхот имеет огромный минус - мы вынуждены дублировать переопределение этого метода во всех классах животных, неумеющих летать.

Что очень усложняет сопровождение программы.

Выход - это создать два новых класса, определяющих возможность полета с общим интерфейсом.

В нашем случае общим названием метода fly.

class canfly():
    def fly(self):
        print 'I can fly'

class cannotfly():
    def fly(self):
        print 'I can NOT fly'

И использовать объекты этого класса для внедрения их в класс животных в качестве одного из свойств.

class animal(object):
    sound = 'uuuuuuuuuuuuu!'
    fly_behavior = None
    def say(self):
        print self.sound

    def move(self):
        print 'I go a head!'

    def display(self):
        print '''##########DISPLAY########'''


class bird(animal):
    def __init__(self):
        self.fly_behavior = canfly()

class cat(animal):
    def __init__(self):
        self.fly_behavior = cannotfly()

Теперь мы свели метод fly в одно место программы и избежали дублирования.

Плюс получили возможность изменять поведение на лету, изменяя свойство fly_behavior.

if __name__ == "__main__":
    o1 = bird()
    o1.display()
    o1.say()
    o1.move()
    o1.fly_behavior.fly()
    ###POLYMORPHISM###########
    def myfly():
        print 'sssssssssssssssss'
    o1.fly_behavior.fly = myfly
    o1.fly_behavior.fly()

Other topics