You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
3.0 KiB

9 months ago
'''
命令模式Command Pattern是一种行为设计模式它封装了一个请求作为一个对象从而让你使用不同的请求把客户端与服务端操作解耦在书城的业务背景中命令模式可以用来实现例如添加购物车项结算订单发送通知等操作
下面是一个简单的使用Python实现的命令模式示例以书城的购物车操作为例
'''
# 购物车类
class ShoppingCart:
def __init__(self):
self.items = []
def add_item(self, book_id, quantity):
self.items.append({'book_id': book_id, 'quantity': quantity})
print(f"Added {quantity} of book ID {book_id} to the cart.")
def remove_item(self, book_id):
self.items = [item for item in self.items if item['book_id'] != book_id]
print(f"Removed book ID {book_id} from the cart.")
# 命令接口
class Command:
def execute(self):
pass
# 具体命令类 - 添加购物车项
class AddToCartCommand(Command):
def __init__(self, shopping_cart, book_id, quantity):
self.shopping_cart = shopping_cart
self.book_id = book_id
self.quantity = quantity
def execute(self):
self.shopping_cart.add_item(self.book_id, self.quantity)
# 具体命令类 - 移除购物车项
class RemoveFromCartCommand(Command):
def __init__(self, shopping_cart, book_id):
self.shopping_cart = shopping_cart
self.book_id = book_id
def execute(self):
self.shopping_cart.remove_item(self.book_id)
# 调用者Invoker
class Invoker:
def __init__(self):
self.commands = []
def store_and_execute_command(self, command):
self.commands.append(command)
command.execute()
# 客户端代码
if __name__ == "__main__":
cart = ShoppingCart()
invoker = Invoker()
# 创建添加购物车项命令
add_command = AddToCartCommand(cart, "12345", 2)
invoker.store_and_execute_command(add_command)
# 创建移除购物车项命令
remove_command = RemoveFromCartCommand(cart, "12345")
invoker.store_and_execute_command(remove_command)
'''
在这个例子中我们有一个ShoppingCart类它有两个方法add_item和remove_item用于添加和移除购物车项然后我们定义了一个命令接口Command和一个调用者InvokerInvoker可以存储并执行命令
具体命令类AddToCartCommand和RemoveFromCartCommand实现了Command接口并在execute方法中调用了ShoppingCart的相应操作
客户端代码创建了ShoppingCart实例和Invoker实例并创建了添加和移除购物车项的具体命令对象这些命令对象通过调用者的store_and_execute_command方法被存储和执行
这个命令模式的实现将购物车操作和实际的执行逻辑解耦允许客户端在不知道具体操作的情况下存储和执行命令这对于支持撤销操作记录命令历史排队命令等高级功能非常有用
'''