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

    #写在前面

    也了解了不少设计模式了,他们都有一个通病,那就是喜欢把简单的东西复杂化。比如在不同的类中加个第三者。哈哈哈,简单变复杂是有目的的,那就是降低耦合度,增强可维护性,提高代码复用性,使代码变得健壮。

     #小白入门--理解什么是命令模式

    学校中、生活中、社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在。命令这一词也就在阶层中诞生。家长命令孩子,老师命令学生,领导命令小娄娄。这些都在我们的生活存在的东西,相信这一个模式学习起来也会比较简单的。这次我们就举一个领导命令员工的例子来学习命令模式。
      工作中领导经常会叫(命令)你去做一些事情,但是领导并不关心你怎么做的,只需要知道你做的结果就好了。怎么做是你自己的事情,做不好就等着加班吧(开玩笑的,一般都会说自己自愿的,哈哈),做的好功劳也不好是你的,哈哈好像有点小黑暗。一般大领导会叫小领导做事情,小领导才叫小娄娄。然后功劳你懂的。不多说了,说多了都是泪。

    #命令模式定义

    命令模式是一个高内聚的模式,其定义为:Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

    #命令模式结构图

    #命令模式参与者: 

     ◊ Command:命令抽象类,声明一个执行操作的接口Execute,该抽象类并不实现这个接口,所有的具体命令都继承自命令抽象类。
      ◊ ConcreteCommand
        ° 定义一个接收者对象与动作之间的请求绑定
        ° 调用Receiver的操作,实现Execute方法
      ◊ Invoker:命令的接收者,将命令请求传递给相应的命令对象,每个ConcreteCommand都是一个Invoker的成员
      ◊ Receiver:命令的接收者,知道如何实施与执行一个请求相关的操作
      ◊ Client:客户端程序,创建一个具体命令对象并设定它的接收者
      Command对象作为Invoker的一个属性,当点击事件发生时,Invoker调用方法Invoke()将请求发送给ConcreteCommand,再由ConcreteCommand调用Execute()将请求发送给Receiver,Client负责创建所有的角色,并设定Command与Invoker和Receiver之间的绑定关系。

    Command:声明接口操作(抽象命令)
    ConcreteCommand:将一个Receiver对象和一个操作绑定在一起(具体的命令,比如,去把房子盖好)
    Client:创建ConcreteCommand对象并设定其接收者(这是大领导,负责下达命令,其他都不关心)
    Invoker:要求该ConcreteCommand执行这个请求(这是小领导,大领导给小领导下达的命令,小领导让小喽喽去办)
    Receiver:知道如何实施与执行一个请求相关的操作(这是小喽喽,负责执行小喽喽传达的命令,苦活累活都得干)


    抽象命令
    具体命令
    命令接收者:执行命令
    命令调用者
    客户端:发送命令

     #举个例子

     

    #抽象命令接口,声明接口Execute,具体命令都继承这个接口
    class Command:
        def Execute(self):
            pass
    
    
    #具体命令,coding,testing,,把[小喽喽]和[干活]绑定在一起
    class ConcreteCommand1(Command): #写代码命令
        def __init__(self,receiver):
            self.receiver=receiver
    
        def execute(self):
            self.receiver.coding()
    
    class ConcreteCommand2(Command): #进行测试命令
        def __init__(self,receiver):
            self.receiver=receiver
    
        def execute(self):
            self.receiver.testing()
    
    
    #命令接受者,负责执行具体命令,是真正做事的人,定义小喽喽
    class Receiver:
        def coding(self):
            print('我是小喽啰,苦活累活都是我的')
            print('...小领导传来命令了,正在coding,请勿打扰...')
    
        def testing(self):
            print('我是小喽啰,苦活累活都是我的')
            print('...小领导传来命令了,正在testing,请勿打扰...')
    
    
    #命令调用者,相当于小领导,负责传达大领导的命令,让小喽啰去执行
    class Invoker:
        def execute(self,cmd):
            print('李工,上级下达了命令,这周要把代码码完,测试做完,你去做吧')
            cmd.execute()
        
       
    #模仿client,是大领导,负责下达命令
    if __name__=='__main__':
        receiver=Receiver()
    
        #大领导下达了俩命令
        code=ConcreteCommand1(receiver)
        test=ConcreteCommand2(receiver)
       
        invoker=Invoker()
        #小领导传达大领导的命令,让小喽啰去执行
        invoker.execute(code)
        print('======================')
        invoker.execute(test)
    

    参考:

    https://www.kancloud.cn/sstd521/design/193555

    https://www.cnblogs.com/libingql/p/3651624.html

    https://www.cnblogs.com/liaoweipeng/p/5693154.html

    https://blog.csdn.net/ruoyunliufeng/article/details/78725188

    https://www.cnblogs.com/chenpi/p/5216488.html

    https://blog.csdn.net/ruoyunliufeng/article/details/78725188

  • 相关阅读:
    BZOJ_3159_决战
    11.19 ~ 11.25训练计划+总结
    BZOJ_1304_[CQOI2009]叶子的染色_树形DP
    BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP
    BZOJ_4033_[HAOI2015]树上染色_树形DP
    BZOJ_5338_ [TJOI2018]xor_可持久化trie
    BZOJ_2957_楼房重建_线段树
    BZOJ_3124_[Sdoi2013]直径_树形DP
    BZOJ_4987_Tree_树形DP
    「JOISC 2019 Day2」两个天线(线段树)
  • 原文地址:https://www.cnblogs.com/baxianhua/p/11133357.html
Copyright © 2011-2022 走看看