命令模式

模式定义:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

模式结构:

  • 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()

 

posted @ 2019-02-12 14:09  家迪的家  阅读(202)  评论(0编辑  收藏  举报