from abc import ABCMeta, abstractmethod
# 命令模式四个角色:命令、接收者、调度者、用户
# 对命令的发送者和接收者进行解耦,高内聚
# 其中的调度者有点像Scrapy框架中的Scheduler,对请求和响应进行调度
class Command(metaclass=ABCMeta):
"""命令的抽象类"""
@abstractmethod
def execute(self):
pass
class CommandImpl(Command):
"""命令的具体实现类"""
def __init__(self, receiver):
self.__receiver = receiver
def execute(self):
self.__receiver.doSomethig()
class Receiver:
"""命令的接收者"""
def doSomethig(self):
print("do Something...")
class Invoker:
"""调度者"""
def __init__(self):
self.__command = None
def setCommand(self, command):
self.__command = command
def action(self):
if self.__command is not None:
self.command.execute()
# 实战应用
class GameRole:
"""游戏的角色"""
STEP = 5
def __init__(self, name):
self.__name = name
self.__x = 0
self.__y = y
self.__z = z
def leftMove(self):
self.__x -= self.STEP
def rightMove(self):
self.__x += self.STEP
def upMove(self):
self.__y += self.STEP
def downMove(self):
self.__y -= self.STEP
def jumpMove(self):
self.__z += self.STEP
def squatMove(self):
self.__z -= self.STEP
def attack(self):
print("%s发动了攻击..." % self.__name)
def showPosition(self):
print("%s 的位置:(x:%s, y:%s, z:%s)" % (self.__name, self.__x, self.__y, self.__z))
class GameCommamd(metaclass=ABCMeta):
"""游戏角色的命令类"""
def __init__(self, role):
self.__role = role
def setRole(self, role):
self.__role = role
@abstractmethod
def execute(self):
pass
class Left(GameCommamd):
"""左移"""
def execute(self):
self.__role.leftMove()
self.__role.showPosition()
class Right(GameCommamd):
"""右移"""
def execute(self):
self.__role.rightMove()
self.__role.showPosition()
class Up(GameCommamd):
"""上移"""
def execute(self):
self.__role.upMove()
self.__role.showPosition()
class Down(GameCommamd):
"""下移"""
def execute(self):
self.__role.downMove()
self.__role.showPosition()
class Jump(GameCommamd):
"""弹跳"""
def execute(self):
self.__role.jumpMove()
self.__role.showPosition()
class Squat(GameCommamd):
"""下蹲"""
def execute(self):
self.__role.squatMove()
self.__role.showPosition()
class Attack(GameCommamd):
"""攻击"""
def execute(self):
self.__role.attack()
self.__role.showPosition()
class MacroCommand(GameCommamd):
""""组合"""
def __init__(self, role=None):
super().__init__(role)
self.__commands = []
def addCommand(self, command):
self.__commands.append(command)
def execute(self):
for command in self.__commands:
command.execute()
class GameInvoker:
"""命令调度者"""
def __init__(self):
self.__command = None
def setCommand(self, command):
self.__command = command
def action(self):
if self.__command is not None:
self.__command.execute()