forked from Volodichev/patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommand.py
More file actions
115 lines (84 loc) · 3.83 KB
/
command.py
File metadata and controls
115 lines (84 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
from __future__ import annotations
from abc import ABC, abstractmethod
class Command(ABC):
"""
Интерфейс Команды объявляет метод для выполнения команд.
"""
@abstractmethod
def execute(self) -> None:
pass
class SimpleCommand(Command):
"""
Некоторые команды способны выполнять простые операции самостоятельно.
"""
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):
"""
Но есть и команды, которые делегируют более сложные операции другим
объектам, называемым «получателями».
"""
def __init__(self, receiver: Receiver, a: str, b: str) -> None:
"""
Сложные команды могут принимать один или несколько объектов-получателей
вместе с любыми данными о контексте через конструктор.
"""
self._receiver = receiver
self._a = a
self._b = b
def execute(self) -> None:
"""
Команды могут делегировать выполнение любым методам получателя.
"""
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:
"""
Классы Получателей содержат некую важную бизнес-логику. Они умеют выполнять
все виды операций, связанных с выполнением запроса. Фактически, любой класс
может выступать Получателем.
"""
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:
"""
Отправитель связан с одной или несколькими командами. Он отправляет запрос
команде.
"""
_on_start = None
_on_finish = None
"""
Инициализация команд.
"""
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:
"""
Отправитель не зависит от классов конкретных команд и получателей.
Отправитель передаёт запрос получателю косвенно, выполняя команду.
"""
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__":
"""
Клиентский код может параметризовать отправителя любыми командами.
"""
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()