当前位置: 首页 > news >正文

行为型模式-命令模式

行为型模式-命令模式

    • 命令模式(Command)
    • 解决命令执行问题
      • 描述
      • 适用环境
      • 优点:
      • 缺点:
      • 违反原则:
      • 代码实现

命令模式(Command)

解决命令执行问题

描述

将一个请求封装为一个对象,并定义该对象的执行方法,从而使得请求能够被延迟、队列化、记录和撤销。这种方式可以提高代码的重用性和可维护性,同时也能够支持事务性操作。

适用环境

当需要将请求封装成对象时使用;当需要支持撤销操作时使用。

优点:

可以将请求的发送者和接收者解耦,提高系统的灵活性;可以很容易地扩展新的命令。

缺点:

对于过多的命令,会导致系统代码变得复杂;命令模式可能会导致系统的性能下降。

违反原则:

开放-封闭原则:如果需要增加新的命令,则需要修改所有的命令类,违反该原则。

代码实现

书店订单系统当客户提交订单时需要将订单信息保存下来。
现在使用传统的方式来处理订单:

class Book:def __init__(self, name, price):self.name = nameself.price = priceclass Order:def __init__(self):self.order_items = []def add_item(self, item):self.order_items.append(item)def place_order(self):total_price = sum([item.price for item in self.order_items])print(f"订单总金额为{total_price}元")book1 = Book('Python编程从入门到实践', 68.0)
book2 = Book('流畅的Python', 79.0)
order = Order()
order.add_item(book1)
order.add_item(book2)
order.place_order()

以上代码存在以下问题:

  1. 对订单进行其他操作时需要修改原有的代码。不同的操作编写不同的方法导致代码冗余。
    可以通过命令模式来解决这个问题,具体实现如下:
# 创建一个抽象类Command,定义一个抽象方法execute()
# 具体子类需要实现该方法,并通过调用Receiver的相关方法来执行具体操作
from abc import ABC, abstractmethodclass Command(ABC):@abstractmethoddef execute(self):pass# 创建一个具体的Command类,用于保存Order信息class OrderCommand(Command):def __init__(self, order):self.order = orderdef execute(self):total_price = sum([item.price for item in self.order.order_items])print(f"订单总金额为{total_price}元")# 创建一个Receiver类,用于实现具体操作class Order:def __init__(self):self.order_items = []def add_item(self, item):self.order_items.append(item)def remove_item(self, item):self.order_items.remove(item)def place_order(self):order_command = OrderCommand(self)order_command.execute()book1 = Book('Python编程从入门到实践', 68.0)
book2 = Book('流畅的Python', 79.0)
order = Order()
order.add_item(book1)
order.add_item(book2)
order.place_order()
http://www.lryc.cn/news/56418.html

相关文章:

  • SHELL综合练习1
  • ROS开发之如何使用发布者、订阅者和话题消息?
  • 基于Java+Springboot+vue高校资源共享交流平台设计和实现
  • 收藏! 38个Python数据科研库
  • SpringBoot过滤器获取Bean-请求重复可读-获取请求体数据-用户IP归属地获取
  • 有哪些特别小众而有趣的编程语言呢?
  • vue中使用高德
  • React class组件和hooks setState异步更新数据详解
  • ToBeWritten之嵌入式操作系统
  • git 实际开发中使用-解决问题
  • 新星计划·2023-第1期 - Python赛道报名入口 -〖你就是下一个新星〗
  • Android LowMemoryKiller概述
  • 特殊操作流——案例:游戏次数
  • git clone connect to gitlab sign in token弹窗让我输入用户名和密码
  • 【Blender】如何在Blender中添加HDRI环境贴图
  • 前端监控指的是什么?
  • .net core 面试题 2023
  • 和ChatGPT关于Swing music的一场对话(上篇)
  • java版工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单
  • debian 10 扩展分区容量
  • 【无功优化】基于改进遗传算法的电力系统无功优化研究【IEEE30节点】(Matlab代码实现)
  • LeetCode 218. 天际线问题
  • Logstash:使用自定义正则表达式模式
  • 常见的一致性问题及解决
  • vue下载文件
  • 人人都是数据分析师-数据分析之数据图表可视化(下)
  • 考勤、充电,绑身份,你的人员定位系统就缺它了!
  • RocketMQ水平扩展及负载均衡详解
  • java接口笔记
  • 安利安利-向大家推荐一个超级牛的etcd管理工具-EtcdKeeperFyne