In object-oriented programming, the command pattern is a behavioral design pattern in which an object is used to encapsulate all information needed to perform an action or trigger an event at a later time. This information includes the method name, the object that owns the method and values for the method parameters.
Trong lập trình hướng đối tượng, command pattern là một mẫu thiết kế hành vi trong đó một đối tượng được sử dụng để đóng gói tất cả thông tin cần thiết để thực hiện một hành động hoặc kích hoạt một sự kiện vào một thời điểm sau này. Thông tin này bao gồm tên phương thức, đối tượng sở hữu phương thức và các giá trị cho các tham số của phương thức.
Ví dụ: trong ngữ cảnh của một hệ thống đơn giản quản lý các tác vụ (tasks) với khả năng undo/ redo
from abc import ABC, abstractmethod
# Command interface
class Command(ABC):
    @abstractmethod
    def execute(self):
        pass
    @abstractmethod
    def undo(self):
        pass
# Receiver
class TaskManager:
    def __init__(self):
        self.tasks = []
    def add_task(self, task):
        self.tasks.append(task)
    def remove_task(self, task):
        self.tasks.remove(task)
    def display_tasks(self):
        print("Tasks:")
        for task in self.tasks:
            print(task)
# Concrete command classes
class AddTaskCommand(Command):
    def __init__(self, task_manager, task):
        self.task_manager = task_manager
        self.task = task
    def execute(self):
        self.task_manager.add_task(self.task)
    def undo(self):
        self.task_manager.remove_task(self.task)
class RemoveTaskCommand(Command):
    def __init__(self, task_manager, task):
        self.task_manager = task_manager
        self.task = task
    def execute(self):
        self.task_manager.remove_task(self.task)
    def undo(self):
        self.task_manager.add_task(self.task)
# Invoker
class TaskInvoker:
    def __init__(self):
        self.command_stack = []
    def execute(self, command):
        command.execute()
        self.command_stack.append(command)
    def undo_last(self):
        if self.command_stack:
            command = self.command_stack.pop()
            command.undo()
if __name__ == "__main__":
    task_manager = TaskManager()
    task_invoker = TaskInvoker()
    task1 = "Complete Project A"
    task2 = "Submit Report"
    task3 = "Prepare Presentation"
    add_task1_command = AddTaskCommand(task_manager, task1)
    add_task2_command = AddTaskCommand(task_manager, task2)
    add_task3_command = AddTaskCommand(task_manager, task3)
    task_invoker.execute(add_task1_command)  # Adds task1 to the list
    task_invoker.execute(add_task2_command)  # Adds task2 to the list
    task_invoker.undo_last()                # Undo adding task2
    task_invoker.execute(add_task3_command)  # Adds task3 to the list
    task_manager.display_tasks()
    # Output:
    # Tasks:
    # Complete Project A
    # Prepare Presentation

 
                                        
                
                 
  
  
  
  
  
 