В предыдущем видео вы познакомились с таким паттерным проектированием как цепочка обязанностей. Давайте сейчас попробуем на примере языка программирования Python написать самую простую цепочку обязанностей, какая может быть. Представьте, что мы продолжаем писать нашу компьютерную игру и дошли до создания квестов. При создании квестов нам нужно описать персонажа, который будет их проходить. У нашего персонажа будет некоторое имя, некоторое количество опыта, а также множество сданных квестов и полученных квестов. На момент инициализации эти множества будут пустыми. Объявим несколько квестов: это будет квест "поговорить с фермером", квест "поохотиться на крыс" и квест "принести какие-то доски сарая". У каждого квеста у нас будет название, собственно косвенным им, и количество опыта, которое мы получаем за прохождение этого самого квеста. Давайте рассмотрим логику. Когда мы берем квест, мы проверяем, что он не был нами получен и не был сдан. Если квест еще не был получен и не был сдан, то мы можем его взять. Для этого добавляем в наш квест, в переменную "taken_quest", и пишем, что он получен. Если же у нас квест уже получен, то мы можем его сдать. Для этого пишем, что квест сдан, удаляем его из списка полученных квестов, а также добавляем в уже сданные квесты. Кроме того, персонаж за прохождение квеста получает некоторое определенное количество опыта. Напишем квест Гивера, который, собственно, и будет давать нам эти квесты. У квест Гивера будет некоторый список квестов, которые он может дать. Мы можем добавить в этот список новый квест — происхождение каких-то определенных ситуаций. Также мы можем обработать нашего персонажа, дать ему квесты. Для этого мы по всем квестам проходимся и выполняем квест для нашего персонажа. Давайте посмотрим, как это работает. Для начала создадим список всех доступных квестов: add_guest_carry, hunt, speak. Создадим нашего квест Гивера. В начале у него не будет ни одного квеста, давайте добавим ему квестов. Пробегаемся по списку всех квестов и добавляем их к нашему квест Гиверу, "quest_giver.add_quest(quest)". Чтобы проверить, создадим нашего персонажа, это будет игрок — плеер, "player = Character()". В начале у нашего игрока не будет ни получено, ни сдано ни одного квеста, как мы описали в начале. Давайте попробуем обратиться к квест Гиверу. Смотрим, что мы получили квест "принести доски", "поохотиться на крыс" и "поговорить с фермером". Давайте проверим, что же произошло в переменах нашего персонажа. Смотрим квесты, которые получены и которые сданы. Итак, полученный квест "поговорить с фермером", "принести доски", "поохотиться на крыс", и пока не сдано ни одного квеста. Давайте теперь изменим список наших полученных квестов. Пусть на данный момент будут получены квесты "принести доски из сарая" и "поговорить с фермером", а квест "охота на крыс" пока не будет получен. Обратимся к нашему квест Гиверу и посмотрим, что же произошло. Итак, квесты, которые были получены, то есть "принести доски", "поговорить с фермером", у нас оказались сданы, а квест "охота на крыс", который до этого не был получен — мы его получили. Давайте теперь еще раз попробуем обратиться к нашему квест Гиверу, посмотреть, что выйдет дальше. Итак, мы видим, что квест "охота на крыс", тот самый квест, который вы получили на прошлой итерации, он оказался сдан, а все остальные квесты они у нас уже и получены, и сданы, поэтому с ними ничего не произошло. Итак, мы реализовали какую-то самую простую цепочку выполнения задач. Это не совсем цепочка обязанностей, потому что ключевой особенностью цепочки обязанностей является передача задачи следующему обработчику, если текущий обработчик не может ее выполнить. В данном случае передачи у нас не было, и в следующем видео мы рассмотрим, как можно изменить данный код, чтобы у нас полностью работал паттерн цепочка обязанностей, и события передавались следующему обработчику при невозможности обработки текущим.