147 lines
3.4 KiB
Python
147 lines
3.4 KiB
Python
"""
|
|
实例:
|
|
汤宝宝成为一国之王,手下有一个传令官和三个大臣,分别是内政大臣、外交大臣和军事大臣。
|
|
有一天,汤宝宝想要发布一个命令,传令官负责将命令传达给大臣们,大臣们根据命令的内容决定是否执行。
|
|
"""
|
|
|
|
from abc import ABC, abstractmethod
|
|
|
|
|
|
# 接收者接口
|
|
class Receiver(ABC):
|
|
@abstractmethod
|
|
def perform(self):
|
|
pass
|
|
|
|
def abort(self):
|
|
pass
|
|
|
|
|
|
# 内政大臣
|
|
class HomeSecretary(Receiver):
|
|
is_performing: bool
|
|
|
|
def __init__(self):
|
|
self.is_performing = False
|
|
|
|
def perform(self):
|
|
self.is_performing = True
|
|
print("内政大臣开始执行命令")
|
|
|
|
def abort(self):
|
|
self.is_performing = False
|
|
print("内政大臣取消执行命令")
|
|
|
|
|
|
# 外交大臣
|
|
class ForeignSecretary(Receiver):
|
|
is_performing: bool
|
|
|
|
def __init__(self):
|
|
self.is_performing = False
|
|
|
|
def perform(self):
|
|
self.is_performing = True
|
|
print("外交大臣开始执行命令")
|
|
|
|
def abort(self):
|
|
self.is_performing = False
|
|
print("外交大臣取消执行命令")
|
|
|
|
|
|
# 军事大臣
|
|
class DefenseSecretary(Receiver):
|
|
is_performing: bool
|
|
|
|
def __init__(self):
|
|
self.is_performing = False
|
|
|
|
def perform(self):
|
|
self.is_performing = True
|
|
print("军事大臣开始执行命令")
|
|
|
|
def abort(self):
|
|
self.is_performing = False
|
|
print("军事大臣取消执行命令")
|
|
|
|
|
|
# 命令接口
|
|
class Command(ABC):
|
|
@abstractmethod
|
|
def execute(self):
|
|
pass
|
|
|
|
|
|
# 执行命令
|
|
class performCommand(Command):
|
|
receiver: Receiver
|
|
|
|
def __init__(self, receiver: Receiver):
|
|
self.receiver = receiver
|
|
|
|
def execute(self):
|
|
self.receiver.perform()
|
|
|
|
|
|
# 取消命令
|
|
class abortCommand(Command):
|
|
receiver: Receiver
|
|
|
|
def __init__(self, receiver: Receiver):
|
|
self.receiver = receiver
|
|
|
|
def execute(self):
|
|
self.receiver.abort()
|
|
|
|
|
|
# 传令官
|
|
class Herald:
|
|
commands: list[Command]
|
|
|
|
def __init__(self):
|
|
self.commands = []
|
|
|
|
def addCommand(self, command: Command):
|
|
self.commands.append(command)
|
|
|
|
def executeCommands(self):
|
|
for command in self.commands:
|
|
command.execute()
|
|
self.commands.clear()
|
|
|
|
if __name__ == "__main__":
|
|
print("========= 命令模式 =========")
|
|
# 创建接收者
|
|
home_secretary = HomeSecretary()
|
|
foreign_secretary = ForeignSecretary()
|
|
defense_secretary = DefenseSecretary()
|
|
|
|
# 创建命令
|
|
perform_home_command = performCommand(home_secretary)
|
|
perform_foreign_command = performCommand(foreign_secretary)
|
|
perform_defense_command = performCommand(defense_secretary)
|
|
|
|
abort_home_command = abortCommand(home_secretary)
|
|
abort_foreign_command = abortCommand(foreign_secretary)
|
|
abort_defense_command = abortCommand(defense_secretary)
|
|
|
|
# 创建传令官
|
|
herald = Herald()
|
|
|
|
# 添加执行命令
|
|
herald.addCommand(perform_home_command)
|
|
herald.addCommand(perform_foreign_command)
|
|
herald.addCommand(perform_defense_command)
|
|
|
|
# 执行命令
|
|
herald.executeCommands()
|
|
|
|
# 添加取消命令
|
|
herald.addCommand(abort_home_command)
|
|
herald.addCommand(abort_foreign_command)
|
|
herald.addCommand(abort_defense_command)
|
|
|
|
# 执行取消命令
|
|
herald.executeCommands()
|
|
|
|
print("\n======= 命令模式结束 =======") |