命令模式(Command Pattern)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 命令模式(Command Pattern)是一种行为型设计模式,它将请求或操作封装成对象,以便于使用不同的请求、队列或日志来参数化其他对象。命令模式可以将命令的请求者和执行者解耦,从而增强系统的灵活性和可扩展性。

命令模式(Command Pattern)是一种行为型设计模式,它将请求或操作封装成对象,以便于使用不同的请求、队列或日志来参数化其他对象。命令模式可以将命令的请求者和执行者解耦,从而增强系统的灵活性和可扩展性。

在命令模式中,有四个核心角色:Command(命令)、ConcreteCommand(具体命令)、Receiver(接收者)和Invoker(调用者)。Command(命令)定义了命令的接口,包括执行命令和撤销命令两个方法。ConcreteCommand(具体命令)实现了Command接口,负责执行具体的操作。Receiver(接收者)负责具体的业务逻辑,它知道如何实现命令所要求的操作。Invoker(调用者)负责调用命令并执行相应的操作。

下面是一个简单的命令模式Demo,假设有一家餐厅,它提供了不同的菜品,客人可以通过命令点餐,服务员可以根据客人的命令进行下单:

# 命令接口
class Command:
    def execute(self):
        pass

    def undo(self):
        pass

# 具体命令类
class OrderCommand(Command):
    def __init__(self, receiver, dish):
        self._receiver = receiver
        self._dish = dish

    def execute(self):
        self._receiver.add_dish(self._dish)

    def undo(self):
        self._receiver.remove_dish(self._dish)

# 接收者类
class Receiver:
    def __init__(self):
        self._dishes = []

    def add_dish(self, dish):
        self._dishes.append(dish)
        print(f"Add dish: {dish}")

    def remove_dish(self, dish):
        if dish in self._dishes:
            self._dishes.remove(dish)
            print(f"Remove dish: {dish}")

    def show_dishes(self):
        print("Current dishes:")
        for dish in self._dishes:
            print(dish)

# 调用者类
class Invoker:
    def __init__(self):
        self._commands = []

    def add_command(self, command):
        self._commands.append(command)

    def execute_commands(self):
        for command in self._commands:
            command.execute()

# 客户端代码
receiver = Receiver()
invoker = Invoker()

command1 = OrderCommand(receiver, "Sweet and Sour Pork")
command2 = OrderCommand(receiver, "Kung Pao Chicken")

invoker.add_command(command1)
invoker.add_command(command2)

invoker.execute_commands()

receiver.show_dishes()

command2.undo()

receiver.show_dishes()

在这个Demo中,Command是命令接口,定义了命令的接口,包括执行命令和撤销命令两个方法。OrderCommand是具体命令类,实现了Command接口,负责执行具体的操作。Receiver是接收者类,负责具体的业务逻辑。Invoker是调用者类,负责调用命令并执行相应的操作。

当客户端使用命令模式时,需要先定义一个命令接口和一个具体命令类。具体命令类负责实现命令接口,它包含了一个接收者对象,并实现了execute和undo方法来执行和撤销命令。接收者类负责具体的业务逻辑,例如餐厅中的菜品管理。调用者类负责调用命令并执行相应的操作,例如服务员点餐。

命令模式的应用场景比较广泛,例如:

  1. GUI框架中的命令模式:在GUI框架中,每个控件都可以使用命令模式来处理用户的操作,例如按钮控件、菜单控件等。
  2. 操作日志记录:命令模式可以用于记录操作日志,例如在系统中执行某些操作时,可以使用命令模式来记录操作日志,以便于后续的审计和追踪操作。
  3. 事务处理:命令模式可以用于处理事务,例如在数据库中执行某些操作时,可以使用命令模式将多个操作封装成一个命令,以便于进行事务管理。

总之,命令模式的优点在于它可以将请求或操作封装成对象,从而增强系统的灵活性和可扩展性,同时也可以将命令的请求者和执行者解耦,降低系统的耦合度。


以下是几本关于命令模式的推荐书籍:

1.《设计模式:可复用面向对象软件的基础》(原书名:Design Patterns: Elements of Reusable Object-Oriented Software),Gang of Four等著,是命令模式的经典参考书之一。

2.《Head First设计模式》(原书名:Head First Design Patterns),Eric Freeman等著,是一本通俗易懂的设计模式入门书籍,其中介绍了命令模式以及其他设计模式的基本理念和实现方法。

3.《大话设计模式》(原书名:大话设计模式),程杰著,是一本通俗易懂的设计模式入门书籍,其中介绍了命令模式以及其他设计模式的基本理念和实现方法,适合初学者阅读。

以下是一些关于命令模式的推荐文章和博客:

1.《命令模式(Command) - 设计模式系列教程》:这是一篇比较详细的介绍命令模式的博客文章,其中包含了一些代码示例和实际应用案例。

2.《从实际需求出发,探讨命令模式的设计与实现》:这是一篇介绍命令模式实现方式的博客文章,其中包含了一些实际应用场景的案例,适合了解命令模式的读者阅读。

3.《设计模式之命令模式》:这是一篇介绍命令模式基本概念和实现方式的博客文章,适合初学者阅读。

希望这些推荐资料可以帮助你更好地了解命令模式的基本概念和实现方式。

相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
目录
相关文章
|
9月前
|
设计模式 语音技术
设计模式12 - 命令模式【Command Pattern】
设计模式12 - 命令模式【Command Pattern】
37 0
|
存储 Java 程序员
行为型模式 - 命令模式(Command Pattern)
行为型模式 - 命令模式(Command Pattern)
|
设计模式 Java
浅谈JAVA设计模式之——命令模式(Command)
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
294 0
浅谈JAVA设计模式之——命令模式(Command)
命令模式(Command)
请求发送者与接收者解耦——命令模式(一)请求发送者与接收者解耦——命令模式(二)请求发送者与接收者解耦——命令模式(三)请求发送者与接收者解耦——命令模式(四)请求发送者与接收者解耦——命令模式(五)请求发送者与接收者解耦——命令模式(六) ...
654 0
|
C# 设计模式 程序员
C#设计模式(15)——命令模式(Command Pattern)
原文:C#设计模式(15)——命令模式(Command Pattern) 一、前言   之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否“优美”、可读。
1131 0