在面向对象编程中,命令模式是概括所有方法信息的设计模式。命令模式封装了执行具体命令所需要的负载信息, 这样命令可以进一步扩展,如取消命令,撤销命令等。
命令模式是由三个组件构成,客户,调用者,接受者。
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')