命令模式
模式定义:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
模式结构:
- Command: 抽象命令类,声明了给所有具体命令类的抽象接口。
- ConcreteCommand: 具体命令类,定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
- Invoker: 调用者,负责调用命令对象执行请求,相关的方法叫做行动方法。
- Receiver: 接收者,负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法
- Client:客户类
实例:键盘按钮控制收音机播放、停止、倒带
from abc import abstractmethod
from abc import ABCMeta
class AudioPlayer:
"""接收者角色"""
def play(self):
print("play...")
def rewind(self):
print("rewind...")
def stop(self):
print("stop...")
class Command(metaclass=ABCMeta):
"""抽象命令类"""
@abstractmethod
def execute(self):
pass
class PlayCommand(Command):
"""具体命令角色类"""
def __init__(self,AudioPlayerObj):
self._my_audio_player = AudioPlayerObj
def execute(self):
self._my_audio_player.play()
class RewindCommand(Command):
"""具体命令角色类"""
def __init__(self,AudioPlayerObj):
self._my_audio_player = AudioPlayerObj
def execute(self):
self._my_audio_player.rewind()
class StopCommand(Command):
"""具体命令角色类"""
def __init__(self,AudioPlayerObj):
self._my_audio_player = AudioPlayerObj
def execute(self):
self._my_audio_player.stop()
class KeyPad:
"""调用者"""
def __init__(self):
self._command = None
def execute_command(self,CommandObj):
self._command = CommandObj
self._command.execute()
class Client:
def main(self):
audio_player = AudioPlayer()
play_command = PlayCommand(audio_player)
rewind_command = RewindCommand(audio_player)
stop_command = StopCommand(audio_player)
key_pad = KeyPad()
key_pad.execute_command(play_command)
key_pad.execute_command(rewind_command)
key_pad.execute_command(stop_command)
if __name__ == "__main__":
client = Client()
client.main()

浙公网安备 33010602011771号