命令模式

作者: nummycode | 来源:发表于2017-07-07 10:04 被阅读5次

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

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

  • 客户:一个实例化的对象
  • 调用者:决定哪个方法被调用
  • 接受者:实际命令的执行者
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')

相关文章

  • 12.vim的使用技巧

    命令模式 、命令行模式、编辑模式: INSERT 首次进入文件: 命令模式输入: 表示 命令行模式出现...

  • 五、Linux vim编辑器

    vim编辑器三种模式:命令模式、编辑模式、末行模式 1.命令模式: vim进入文件后就是命令模式 1.1 命令模式...

  • 终端操作文件

    VIM 模式切换从命令模式->编辑模式:i,a,o,I,A,O从编辑模式->命令模式:ESC从命令模式->末行模式...

  • vim 操作 && Mac 配置本地Apache

    一、vim 的基本命令操作 vim 的模式: 编辑模式 ,命令模式 编辑模式: 命令模式:可以通过命令 最重要的命...

  • Vim高效编辑器

    Vim程序员高效编辑器 命令模式,输入模式,底线命令模式 默认进入vim就是命令模式,输入i变为输入模式 命令模式...

  • Command模式

    命令模式(Command) 命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Tran...

  • 设计模式详解——命令模式

    本篇文章介绍一种设计模式——命令模式。本篇文章内容参考《JAVA与模式》之命令模式。 一、命令模式的概念 命令模式...

  • Vi编辑器

    命令模式 文本输入模式 末行模式。 插入模式 移动光标: 删除命令: 撤销命令: 重复命令 文本行移动: 复制粘贴...

  • JavaScript设计模式七(命令模式)

    JavaScript设计模式七(命令模式) 定义: 命令模式是最简单和优雅的模式之一,命令模式中的命令指的是一个执...

  • Cisco 路由器配置命令大全(二)

    (1)模式转换命令 用户模式----特权模式,使用命令"enable"特权模式----全局配置模式,使用命令"co...

网友评论

    本文标题:命令模式

    本文链接:https://www.haomeiwen.com/subject/ngrlhxtx.html