【程序设计】Python的命令模式

命令模式的定义为:将一个请求封装成一个对象,从而可以使用不同的请求将客户端参数化对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

命令模式中通常涉及三类对象的抽象ReceiverCommandInvoker(本例中的waiterSys)。

只有一个Invoker的命令模式也可以抽象成一个类似的“星形网络”,但与之前介绍的中介者模式不同,单纯的命令模式更像是一个辐射状的结构,由Invoker直接对Receiver传递命令,而一般不反向传递,中介者模式“星形网络”的中心,是个协调者,抽象结节间的信息流全部或者部分是双向的。
另外,命令模式的定义中提到了“撤销和恢复功能”,也给了各位开发人员一个命令模式使用过程中的建议:各个Receiver中可以设计一个回滚接口,支持命令的“撤销”。

优点:
1、低耦合:调用者和接收者之间没有什么直接关系,二者通过命令中的execute接口联系;
2、扩展性好:新命令很容易加入,也很容易拼出“组合命令”。


应用场景:
1、触发-反馈机制的系统,都可以使用命令模式思想。如基于管道结构的命令系统(如SHELL),可以直接套用命令模式;此外,GUI系统中的操作反馈(如点击、键入等),也可以使用命令模式思想。

缺点
1、如果业务场景中命令比较多,那么对应命令类和命令对象的数量也会增加,这样系统会膨胀得很大。


流程图:



python代码实现:

"""

命令模式

饭店有凉菜间、热菜间、主食间,那当服务员将菜品录入到系统中后,
凉菜间会打印出顾客所点的凉菜条目,热菜间会打印出顾客所点的热菜条目,主食间会打印出主食条目。
系统设计成前台服务员系统和后台系统,后台系统进一步细分成主食子系统,凉菜子系统,热菜子系统。
"""


# 后台三个子系统设计
class backSys ():
    def cook(self, dish):
        pass


class mainFoodSys (backSys):
    def cook(self, dish):
        print ("主食:烹调 %s" % dish)


class coolDishSys (backSys):
    def cook(self, dish):
        print ("冷菜:烹调 %s" % dish)


class hotDishSys (backSys):
    def cook(self, dish):
        print ("热菜:烹调 %s" % dish)


# 前台系统构建
class waiterSys ():
    menu_map = dict ()
    commandList = []
    
    def setOrder(self, command):
        print ("服务员:加菜")
        self.commandList.append (command)
    
    def cancelOrder(self, command):
        print ("服务员:撤销指令...")
        self.commandList.remove (command)
    
    def notify(self):
        print ("服务员:修改...")
        for command in self.commandList:
            command.execute ()


# 命令类构建
class Command ():
    receiver = None
    
    def __init__(self, receiver):
        self.receiver = receiver
    
    def execute(self):
        pass


class foodCommand (Command):
    dish = ""
    
    def __init__(self, receiver, dish):
        super ().__init__ (receiver)
        self.receiver = receiver
        self.dish = dish
    
    def execute(self):
        self.receiver.cook (self.dish)


class mainFoodCommand (foodCommand):
    pass


class coolDishCommand (foodCommand):
    pass


class hotDishCommand (foodCommand):
    pass



# 菜单类
class menuAll:
    menu_map=dict()
    def loadMenu(self):#加载菜单,这里直接写死
        self.menu_map["hot"] = ["Yu-Shiang Shredded Pork", "Sauteed Tofu, Home Style", "Sauteed Snow Peas"]
        self.menu_map["cool"] = ["Cucumber", "Preserved egg"]
        self.menu_map["main"] = ["Rice", "Pie"]
    def isHot(self,dish):
        if dish in self.menu_map["hot"]:
            return True
        return False
    def isCool(self,dish):
        if dish in self.menu_map["cool"]:
            return True
        return False
    def isMain(self,dish):
        if dish in self.menu_map["main"]:
            return True
        return False





if  __name__=="__main__":
    dish_list=["Yu-Shiang Shredded Pork","Sauteed Tofu, Home Style","Cucumber","Rice"]#顾客点的菜
    waiter_sys=waiterSys()
    main_food_sys=mainFoodSys()
    cool_dish_sys=coolDishSys()
    hot_dish_sys=hotDishSys()
    menu=menuAll()
    menu.loadMenu()
    for dish in dish_list:
        if menu.isCool(dish):
            cmd=coolDishCommand(cool_dish_sys,dish)
        elif menu.isHot(dish):
            cmd=hotDishCommand(hot_dish_sys,dish)
        elif menu.isMain(dish):
            cmd=mainFoodCommand(main_food_sys,dish)
        else:
            continue
        waiter_sys.setOrder(cmd)
    waiter_sys.notify()




原文:https://yq.aliyun.com/articles/71070?spm=a2c4e.11153940.blogcont280715.22.175692aawkXRdB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值