Команда на Python: как это работает
Команда (Сommand) — это паттерн, который позволяет разделять операции и выполнять их независимо друг от друга. Благодаря этому команды можно выстраивать в очереди, откладывать или отменять их выполнение.
По сути, паттерн инкапсулирует всю информацию, необходимую для выполнения действия или запуска события. Для этого команда представляет запрос в виде объекта. Например, одна и та же кнопка в программе может выполнять разные функции: сначала включать свет, а затем стереосистему или открывать двери гаража.
Как работает команда на Python?
Чтобы понять, как работает паттерн Сommand, можно посмотреть на схему ниже, но перед этим объясним некоторые термины:
- Receiver — объект, который получает и выполняет команду;
- Invoker — объект, который отправляет команду получателю (например, кнопка);
- Command Object — объект, который содержит всю необходимую информацию для выполнения действия;
- Client — приложение или компонент, который отправляет команды на выполнение к Receiver.
Особенности паттерна:
- отделяет классы, запускающие операцию, от объекта, который знает, как выполнить операцию;
- позволяет создавать последовательность команд, организуя систему очередей;
- помогает легко и без изменения существующего кода добавлять новые команды;
- поддерживает отменяемые действия.
Для работы Command взаимодействует большое количество классов и объектов. Поэтому разработчику нужно правильно разрабатывать эти классы.
Пример паттерна Command на Python
import abc
class Command(metaclass=abc.ABCMeta):
@abc.abstractmethod
def execute(self):
pass
class LunchCommand(Command):
def __init__(self, lunch):
self.lunch = lunch
def execute(self):
self.lunch.make_lunch()
class DinnerCommand(Command):
def __init__(self, dinner):
self.dinner = dinner
def execute(self):
self.dinner.make_dinner()
class Lunch:
def make_lunch(self):
print("Lunch is being made")
class Dinner:
def make_dinner(self):
print("Dinner is being made")
class MealInvoker:
def __init__(self, command):
self.command = command
def set_command(self, command):
self.command = command
def invoke(self):
self.command.execute()
if __name__ == '__main__':
lunch = Lunch() # receiver
command_lunch = LunchCommand(lunch) # concrete command
dinner = Dinner() # receiver
command_dinner = DinnerCommand(dinner) # concrete command
meal_invoker = MealInvoker(command_lunch); # invoker
meal_invoker.invoke()
meal_invoker.set_command(command_dinner)
meal_invoker.invoke()
Результат:
Lunch is being made Dinner is being made


Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: