zoukankan      html  css  js  c++  java
  • python 设计模式之命令模式

    命令模式介绍:

      在面向对象编程中,命令模式是概括所有方法信息的设计模式。

      此模式对象包涵方法名,及其相关参数值。

      命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵了所有用户需要的方法。

      举个例子:如果有个按钮是用户接口“red”,当被触碰的时候,会启动后台的“turn red”接口。现在用户并不知道,通过什么类或者方法的接口能够让后台处理“turn red”操作,但是这个命令被发送了(触碰“red”按 钮),会使得后台处理“turn red”操作。因此,命令模式给用户一个接口,而不用让用户了解哪些是实际执行的程序,也不会影响到用户程序。

      实现命令模式的关键就是让调用者不要包涵底层实际命令执行代码,相同的调用者应该采用相同的接口。

      命令模式是由三个组件构成,客户,调用者,接受者。

      客户:一个实例化的对象

      调用者:决定哪个方法被调用

      接受者:实际命令的执行者

    Example:

    •   实现一个开关
    •   切换ON/OFF
    •   用开关ON/OFF去硬编码一个事件

    代码如下:

     1 class Switch:
     2     ''' The INVOKER class'''
     3 
     4     def __init__(self, flipUpCmd, flipDownCmd):
     5         self.__flipUpCommand = flipUpCmd
     6         self.__flipDownCommand = flipDownCmd
     7 
     8     def flipUp(self):
     9         self.__flipUpCommand.execute()
    10 
    11     def flipDown(self):
    12         self.__flipDownCommand.execute()
    13 
    14 class Light:
    15     '''The RECEIVER Class'''
    16     def turnOn(self):
    17         print "The light is on"
    18 
    19     def turnOff(self):
    20         print "The light is off"
    21 
    22 class Command:
    23     """The Command Abstrace class"""
    24     def __init__(self):
    25         pass
    26     def execute(self):
    27         pass
    28 
    29 class FlipUpCommand(Command):
    30     '''The Command class for turning on the light'''
    31 
    32     def __init__(self, light):
    33         self.__light = light
    34 
    35     def execute(self):
    36         self.__light.turnOn()
    37 
    38 class FileDownCommand(Command):
    39     '''The Command class for turning off the light'''
    40 
    41     def __init__(self, light):
    42         Command.__init__(self)
    43         self.__light = light
    44 
    45     def execute(self):
    46         self.__light.turnOff()
    47 
    48 class LightSwitch:
    49     '''The Client Class'''
    50     def __init__(self):
    51         self.__lamp = Light()
    52         self.__switchUp = FlipUpCommand(self.__lamp)
    53         self.__switchDown = FileDownCommand(self.__lamp)
    54         self.__switch = Switch(self.__switchUp, self.__switchDown)
    55 
    56     def switch(self, cmd):
    57         cmd = cmd.strip().upper()
    58         try:
    59             if cmd == "ON":
    60                 self.__switch.flipUp()
    61             elif cmd == "OFF":
    62                 self.__switch.flipDown()
    63             else:
    64                 print "Argument "ON" or "OFF" is required"
    65         except Exception,msg:
    66             print "Exception occured:%s" % msg
    67 
    68 
    69 #Execute if the file is run as a script and not imported as a module
    70 
    71 if __name__ == "__main__":
    72     lightSwitch = LightSwitch()
    73 
    74     print "Switch ON test"
    75     lightSwitch.switch("ON")
    76 
    77     print "Switch OFF test"
    78     lightSwitch.switch("OFF")
    79 
    80     print "Invalid Command test"
    81     lightSwitch.switch("****")
    View Code

    总结:面向对象的方法,就是这么牛叉啊,代码看得让人头晕,层层的封装。警惕面向对象编程的过度对象化。

  • 相关阅读:
    Codeforces Gym 100571A A. Cursed Query 离线
    codeforces Gym 100500 J. Bye Bye Russia
    codeforces Gym 100500H H. ICPC Quest 水题
    codeforces Gym 100500H A. Potion of Immortality 简单DP
    Codeforces Gym 100500F Problem F. Door Lock 二分
    codeforces Gym 100500C D.Hall of Fame 排序
    spring data jpa 创建方法名进行简单查询
    Spring集成JPA提示Not an managed type
    hibernate配置文件中的catalog属性
    SonarLint插件的安装与使用
  • 原文地址:https://www.cnblogs.com/lizhitai/p/4451590.html
Copyright © 2011-2022 走看看