mirror of
https://github.com/rjNemo/design-patterns
synced 2026-06-12 13:36:41 +00:00
add code example
This commit is contained in:
parent
78560dc4c9
commit
1db61293f9
5 changed files with 118 additions and 0 deletions
11
behavioral/command/command.py
Normal file
11
behavioral/command/command.py
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
|
||||||
|
|
||||||
|
class Command(ABC):
|
||||||
|
"""
|
||||||
|
The Command interface declares a method for executing a command.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def execute(self) -> None:
|
||||||
|
pass
|
||||||
41
behavioral/command/commands.py
Normal file
41
behavioral/command/commands.py
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
from behavioral.command.command import Command
|
||||||
|
from behavioral.command.receiver import Receiver
|
||||||
|
|
||||||
|
|
||||||
|
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 ({self._payload})")
|
||||||
|
|
||||||
|
|
||||||
|
class ComplexCommand(Command):
|
||||||
|
"""
|
||||||
|
However, some commands can delegate more complex operations to other
|
||||||
|
objects, called "receivers."
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, receiver: Receiver, a: str, b: str) -> None:
|
||||||
|
"""
|
||||||
|
Complex commands can accept one or several receiver objects along with
|
||||||
|
any context data via the constructor.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self._receiver = receiver
|
||||||
|
self._a = a
|
||||||
|
self._b = b
|
||||||
|
|
||||||
|
def execute(self) -> None:
|
||||||
|
"""
|
||||||
|
Commands can delegate to any methods of 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)
|
||||||
38
behavioral/command/invoker.py
Normal file
38
behavioral/command/invoker.py
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from behavioral.command.command import Command
|
||||||
|
|
||||||
|
|
||||||
|
class Invoker:
|
||||||
|
"""
|
||||||
|
The Invoker is associated with one or several commands. It sends a request
|
||||||
|
to the command.
|
||||||
|
"""
|
||||||
|
|
||||||
|
_on_start: Optional[Command] = None
|
||||||
|
_on_finish: Optional[Command] = None
|
||||||
|
|
||||||
|
"""Initialize commands."""
|
||||||
|
|
||||||
|
def set_on_start(self, command: Command) -> None:
|
||||||
|
self._on_start = command
|
||||||
|
|
||||||
|
def set_on_finish(self, command: Command) -> None:
|
||||||
|
self._on_finish = command
|
||||||
|
|
||||||
|
def do_something_important(self) -> None:
|
||||||
|
"""
|
||||||
|
The Invoker does not depend on concrete command or receiver classes. The
|
||||||
|
Invoker passes a request to a receiver indirectly, by executing a
|
||||||
|
command.
|
||||||
|
"""
|
||||||
|
|
||||||
|
print("Invoker: Does anybody want something done before I begin?")
|
||||||
|
if self._on_start:
|
||||||
|
self._on_start.execute()
|
||||||
|
|
||||||
|
print("Invoker: ...doing something really important...")
|
||||||
|
|
||||||
|
print("Invoker: Does anybody want something done after I finish?")
|
||||||
|
if self._on_finish:
|
||||||
|
self._on_finish.execute()
|
||||||
16
behavioral/command/main.py
Normal file
16
behavioral/command/main.py
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
"""
|
||||||
|
The client code can parameterize an invoker with any commands.
|
||||||
|
"""
|
||||||
|
from behavioral.command.commands import SimpleCommand, ComplexCommand
|
||||||
|
from behavioral.command.invoker import Invoker
|
||||||
|
from behavioral.command.receiver import Receiver
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
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()
|
||||||
12
behavioral/command/receiver.py
Normal file
12
behavioral/command/receiver.py
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
class Receiver:
|
||||||
|
"""
|
||||||
|
The Receiver classes contain some important business logic. They know how to
|
||||||
|
perform all kinds of operations, associated with carrying out a request. In
|
||||||
|
fact, any class may serve as a 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="")
|
||||||
Loading…
Reference in a new issue