专栏首页nummy命令模式

命令模式

在面向对象编程中,命令模式是概括所有方法信息的设计模式。命令模式封装了执行具体命令所需要的负载信息, 这样命令可以进一步扩展,如取消命令,撤销命令等。

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

  • 客户:一个实例化的对象
  • 调用者:决定哪个方法被调用
  • 接受者:实际命令的执行者

img

import time
import threading


class Chef(threading.Thread):
    def __init__(self,name):
        self.q = []
        self.doneq = []
        self.do_orders = True
        threading.Thread.__init__(self,)
        self.name = name
        self.start()

    def makeorder(self, order):
        print("%s Preparing Menu :"%self.name )
        for item in order.items:
            print("cooking ",item)
            time.sleep(1)
        order.completed = True
        self.doneq.append(order)

    def run(self,):
        while self.do_orders:
            if len(self.q) > 0:
                order = self.q.pop(0)
                self.makeorder(order)
                time.sleep(1)

    def work_on_order(self,order):
        self.q.append(order)

    def cancel(self, order):
        if order in self.q:
            if order.completed == True:
                print("cannot cancel, order completed")
                return
            else:
                index = self.q.index(order)
                del self.q[index]
                print(" order canceled %s"%str(order))
                return
        if order in self.doneq:
            print("order completed, cannot be canceled")
            return
        print("Order not given to me")


class Check(object):
    def execute(self,):
        raise NotImplementedError()

    def cancel(self,):
        raise NotImplementedError()


class MenuOrder(Check):
    def __init__(self,*items):
        self.items = items
        self.completed = False

    def execute(self,chef):
        self.chef = chef
        chef.work_on_order(self)

    def cancel(self,):
        if self.chef.cancel(self):
            print("order cancelled")
    
    def __str__(self,):
        return ''.join(self.items)

c = Chef("Arun")
order1 = MenuOrder("Omellette", "Dosa", "Idli")
order2 = MenuOrder("Mohito", "Pizza")
order3 = MenuOrder("Rajma", )
order1.execute(c)
order2.execute(c)
order3.execute(c)
time.sleep(1)
order3.cancel()
time.sleep(9)
c.do_orders = False
c.join()

输出结果如下:

Arun Preparing Menu :
('cooking ', 'Omellette')
 order canceled Rajma
('cooking ', 'Dosa')
('cooking ', 'Idli')
Arun Preparing Menu :
('cooking ', 'Mohito')
('cooking ', 'Pizza')

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 模板方法模式

    不知道你有没有注意过,我们实现某个业务功能,在不同的对象会有不同的细节实现, 以前说过策略模式, 策略模式是将逻辑封装在一个类(提到的文章中的Duck)中,然后...

    用户2936342
  • 适配器模式

    上面的例子中,Fish的并不具有running_speed()方法,所以添加适配器类RunningFish,输出结果为:

    用户2936342
  • Python实现子类调用父类方法

    这是因为尽管Student类继承了Person类,但是并没有调用父类的__init__()方法,那么怎样调用父类的方法呢? 有如下两种解决方案:

    用户2936342
  • Python之面向对象三

    面向对象的三大特性: 多态 多态指的是一类事物有多种形态。Python3天生支持多态。 动物有多种形态:人,狗,猪 import abc class Anima...

    新人小试
  • Python 开发者不得不知的魔术方法(Magic Method)

    来源:j_hao104 my.oschina.net/jhao104/blog/779743 介绍 在Python中,所有以“__”双下划线包起来的方法,都统...

    小小科
  • 进击吧!Pythonista(6/100)

    咸鱼学Python
  • Python建造者模式案例运行原理解析

    建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成。只有当各个部分都完成了,这个对象才完整。建造者模式表现为复杂对象的创建...

    砸漏
  • python练习题-day24

    郭耀华
  • Selenium2+python自动化52-unittest执行顺序

    前言 很多初学者在使用unittest框架时候,不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行。 本篇通过...

    上海-悠悠
  • 如何在Python 游戏中模拟引力

    真实的世界充满了运动和生活。物理学使得真实的生活如此忙碌和动态。物理学是物质在空间中运动的方式。既然一个电脑游戏世界没有物质,它也就没有物理学规律,使用游戏程序...

    砸漏

扫码关注云+社区

领取腾讯云代金券