前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >命令模式

命令模式

作者头像
用户2936342
发布2018-08-27 14:23:37
2190
发布2018-08-27 14:23:37
举报
文章被收录于专栏:nummynummy

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

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

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

img

代码语言:javascript
复制
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()

输出结果如下:

代码语言:javascript
复制
Arun Preparing Menu :
('cooking ', 'Omellette')
 order canceled Rajma
('cooking ', 'Dosa')
('cooking ', 'Idli')
Arun Preparing Menu :
('cooking ', 'Mohito')
('cooking ', 'Pizza')
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.07.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档