python 设计模式之命令(Command)模式

#写在前面

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

 

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

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

 

#命令模式定义

命令模式是一个高内聚的模式,其定义为: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:知道如何实施与执行一个请求相关的操做(这是小喽喽,负责执行小喽喽传达的命令,苦活累活都得干)


测试

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

 

 

 #举个例子

 

 

 

#抽象命令接口,声明接口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.htmlcode

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

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

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

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

相关文章
相关标签/搜索