命令模式
模式定义:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
模式结构:
- 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()