命令模式(python)

2021-07-25 23:24:14 字數 3069 閱讀 4873

"""

命令模式

在請求者和請求實現者之間,把請求抽象成命令,並新增乙個命令接受和分發者,實現請求者和實現者的解耦

如客戶(請求者)去燒烤店吃飯,並不需要認識燒烤boy(實現者),只需要有選單(命令),服務員(命令接收和分發者),然後根據

選單給服務員下單就好了。然後選單有會有記錄,我們可以要求撤銷和重做,燒烤店可以拒絕我們的某個選單。

優點:1、可以有乙個命令列表;2、命令可以很容易寫入日誌;3、命令可以被撤銷或重做;4、命令實現者可以拒絕命令;5、實現了請求者

和實現者的解耦;6、要加入新的命令很容易,增加個命令類,實現者能做對應的命令

"""from abc import abcmeta, abstractmethod

class

cooker

(object):

""" 廚師

"""def__init__

(self):

self._num_yang = 1

self._num_niu = 1

defcook_yang

(self):

if self._num_yang <= 3:

print("燒烤羊肉串")

self._num_yang += 1

else:

print("沒羊肉串了")

defcook_niu

(self):

if self._num_niu <= 3:

print("燒烤牛肉串")

self._num_niu += 1

else:

print("沒牛肉串了")

class

command

(object):

""" 抽象選單

"""__metaclass__ = abcmeta

def__init__

(self, name):

self.cooker = cooker()

self.name = name

@abstractmethod

defcook

(self):

pass

class

commandyang

(command):

def__init__

(self, name):

super(commandyang, self).__init__(name)

defcook

(self):

self.cooker.cook_yang()

class

commandniu

(command):

def__init__

(self, name):

super(commandniu, self).__init__(name)

defcook

(self):

self.cooker.cook_niu()

class

waiter

(object):

def__init__

(self):

self._command_list =

self._menu = none

self._kehu = none

defset_kehu

(self, kehu):

self._kehu = kehu

defset_order

(self, command, num=1):

print("加菜:" + command.name)

for i in range(num):

defremove_order

(self, command, num=1):

print("減菜:" + command.name)

try:

for i in range(num):

self._command_list.remove(command)

except exception as e:

print("沒點那麼多菜")

defnotify

(self):

print("下單啦:")

self._menu = order(self._kehu, self._command_list)

self._menu.show()

for command in self._command_list:

command.cook()

self._command_list =

print("")

class

order

(object):

def__init__

(self, name, command_list):

self._command_list = command_list

self._name = name

defset_order

(self, command_list):

self._command_list = command_list

defset_name

(self, name):

self._name = name

defshow

(self):

print(self._name + ",您的選單是:")

for command in self._command_list:

print(command.name)

print("")

if __name__ == '__main__':

# 燒烤店初始化

command_yang = commandyang("羊肉串")

command_niu = commandniu("牛肉串")

waiter = waiter()

# 營業

waiter.set_kehu("張三")

waiter.set_order(command_yang, 4)

waiter.set_order(command_niu, 5)

waiter.notify()

Python設計模式 七 命令模式

命令模式 import os from os.path import lexists class movefilecommand object def init self,src,dest self.src src self.dest dest defexecute self self.rename...

python設計模式(十六) 命令模式

行為請求者 與 行為實現者 通常呈現一種 緊耦合 但在某些場合,比如要對行為進行 記錄 撤銷 重做 事務 等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將 行為請求者 與 行為實現者 解耦?將一組行為抽象為物件,實現二者之間的松耦合。這就是命令模式 command pattern 命...

python設計模式(十六) 命令模式

行為請求者 與 行為實現者 通常呈現一種 緊耦合 但在某些場合,比如要對行為進行 記錄 撤銷 重做 事務 等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將 行為請求者 與 行為實現者 解耦?將一組行為抽象為物件,實現二者之間的松耦合。這就是命令模式 command pattern 命...