close up photo of programming of codes

codecungnhau.com

Một trang web về kỹ thuật lập trình

Python Design Patterns: Command

Command là mẫu thiết kế hành vi chuyển đổi các yêu cầu hoặc hoạt động đơn giản thành các đối tượng. Việc chuyển đổi cho phép thực hiện lệnh hoãn lại hoặc từ xa, lưu trữ lịch sử lệnh, v.v.

Cách sử dụng mẫu

Sử dụng: Mẫu Command khá phổ biến trong mã Python. Thông thường, nó được sử dụng như một sự thay thế cho các lệnh gọi lại để tham số hóa các phần tử UI bằng các hành động. Nó cũng được sử dụng cho các tác vụ xếp hàng, theo dõi lịch sử hoạt động, v.v.

Nhận dạng: Mẫu Command có thể nhận biết được bằng các phương thức hành vi trong kiểu trừu tượng / giao diện (sender), phương thức này gọi một phương thức trong việc triển khai một kiểu giao diện / trừu tượng khác (receiver) đã được đóng gói bởi việc thực thi lệnh trong quá trình tạo nó. Các lớp Command thường được giới hạn trong các hành động cụ thể.

Chương trình mẫu

main.cpp

from __future__ import annotations
from abc import ABC, abstractmethod
class Command(ABC):
    """
    The Command interface declares a method for executing a command.
    """
    @abstractmethod
    def execute(self) -> None:
        pass
class SimpleCommand(Command):
    """
    Some commands can implement simple operations on their own.
    """
    def __init__(self, payload: str) -> None:
        self._payload = payload
    def execute(self) -> None:
        print(f"SimpleCommand: See, I can do simple things like printing"
              f"({self._payload})")
class ComplexCommand(Command):
    """
    Tuy nhiên, một số Command có thể ủy thác các hoạt động phức tạp hơn 
    cho các đối tượng khác, được gọi là "receivers."
    """
    def __init__(self, receiver: Receiver, a: str, b: str) -> None:
        """
        Các Command phức tạp có thể chấp nhận một hoặc một số đối tượng receiver
        cùng với bất kỳ dữ liệu ngữ cảnh nào thông qua phương thức khởi tạo.
        """
        self._receiver = receiver
        self._a = a
        self._b = b
    def execute(self) -> None:
        """
        Các Command có thể ủy quyền cho bất kỳ phương thức nào của receiver.
        """
        print("ComplexCommand: Complex stuff should be done by a receiver object", end="")
        self._receiver.do_something(self._a)
        self._receiver.do_something_else(self._b)
class Receiver:
    """
    Các lớp Receiver chứa một số logic nghiệp vụ quan trọng. Chúng biết cách thực 
    hiện tất cả các loại hoạt động, liên quan đến việc thực hiện một yêu cầu.
    Trên thực tế, bất kỳ lớp nào cũng có thể đóng vai trò là Receiver.
    """
    def do_something(self, a: str) -> None:
        print(f"\nReceiver: Working on ({a}.)", end="")
    def do_something_else(self, b: str) -> None:
        print(f"\nReceiver: Also working on ({b}.)", end="")
class Invoker:
    """
    Invoker liên kết với một hoặc một số Command. Nó gửi một yêu cầu đến Command.
    """
    _on_start = None
    _on_finish = None
    """
    Initialize commands.
    """
    def set_on_start(self, command: Command):
        self._on_start = command
    def set_on_finish(self, command: Command):
        self._on_finish = command
    def do_something_important(self) -> None:
        """
        Invoker không phụ thuộc vào các lớp command. Invoker chuyển một yêu 
        cầu đến receiver gián tiếp, bằng cách thực hiện một command.
        """
        print("Invoker: Does anybody want something done before I begin?")
        if isinstance(self._on_start, Command):
            self._on_start.execute()
        print("Invoker: ...doing something really important...")
        print("Invoker: Does anybody want something done after I finish?")
        if isinstance(self._on_finish, Command):
            self._on_finish.execute()
if __name__ == "__main__":
    """
    Mã client có thể tham số hóa một invoker bằng bất kỳ lệnh nào.
    """
    invoker = Invoker()
    invoker.set_on_start(SimpleCommand("Say Hi!"))
    receiver = Receiver()
    invoker.set_on_finish(ComplexCommand(
        receiver, "Send email", "Save report"))
    invoker.do_something_important()

Kết quả

Invoker: Does anybody want something done before I begin?
SimpleCommand: See, I can do simple things like printing (Say Hi!)
Invoker: ...doing something really important...
Invoker: Does anybody want something done after I finish?
ComplexCommand: Complex stuff should be done by a receiver object.
Receiver: Working on (Send email)
Receiver: Also working on (Save report)

Đã đăng vào

trong

,

bởi

Bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *