Команда на 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
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: