设计模式-牛刀小试02

news2024/9/28 23:28:41

前言

本文为datawhale2022年12月组队学习《大话设计模式》最后一次打卡任务,本次完成homework2。
【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern

一、任务描述

1.1 背景

小李已经是一个工作一年的初级工程师了,他所在的公司是一家大型购物商场。随着各种网络购物软件兴起,老板也想做一个商场的购物 APP。分给小李的是一个一个订单结算模块,需要支持各种不同的结算策略。

1.2 需求

帮小李写一个订单结算模块,要求支持 原价打 X 折满减,满 X 元减 Y 元 三种结算策略。
请增加商品状态,至少包括在售、缺货、上架中三种状态。
另外,一种商品在上架前需要经过库存中心、销售中心、经理审核,请增加商品上架审核功能。

1.3 任务

共三个小任务:

  • Q1:方案设计。
  • Q2:代码实现及结果截图。
  • Q3:解释为什么要用这些模式。

1.4 要求

要求如下:

  • 输入是一揽子商品,输出是最后的订单金额,请检查订单中商品的状态,只结算在售状态商品。
  • 至少包含两种商品,每种使用不同的结算策略,策略可任选其中一个或两个组合(比如满减 + 打折)。
  • 对于商品上架审核功能,输入要补货(缺货状态)的商品和数量,输出不同审核状态,审核结束前,商品处于「上架中」。
  • 不要实现具体函数或方法的逻辑,可以使用 print 输出功能。

二、任务分析

首先拆解一下问题,这个系统需要实现商品结算商品上架审核两个大的功能模块。

2.1 商品结算

这部分可以采用工厂方法模式以及策略模式。代码如下

# -*- coding:utf-8 -*-

# 收费的抽象接口类
class CashSuper(object):
    def __init__(self):
        pass
    def accept_cash(self,money):
        pass

# 收费的具体类
class CashNormal(CashSuper):
    # 正常收费
    def accept_cash(self,money):
        return money
class CashRebate(CashSuper):
    # 打折收费
    __moneyRebate = 1
    def cash_rebate(self,moneyRebateStr):
        self.__moneyRebate = float(moneyRebateStr)
    def accept_cash(self,money):
        return money*self.__moneyRebate
class CashReturn(CashSuper):
    # 返利收费
    __moneyCondition = 0
    __moneyReturn = 0
    def cash_return(self,moneyConditionStr,moneyReturnStr):
        self.__moneyCondition = float(moneyConditionStr)
        self.__moneyReturn = float(moneyReturnStr)
    def accept_cash(self,money):
        result = money
        if (money >= self.__moneyCondition):
            result = money - money // self.__moneyCondition * self.__moneyReturn
        return result


# 产品的抽象类
class ProductFactory(object):
    def __init__(self,name,number,price,stage):
        self.__product_name = name
        self.__product_number = number
        self.__product_price = price
        self.__product_stage = stage
        # OnSale:在售;   OutOfStock:缺货;  InProcess:上架中。
    def set_product_name(self,name):
        self.__product_name = name
    def get_product_name(self):
        return self.__product_name
    def set_product_number(self,number):
        self.__product_number = number
    def get_product_number(self):
        return self.__product_number
    def set_product_price(self,price):
        self.__product_price = price
    def get_product_price(self):
        return self.__product_price
    def set_product_stage(self,stage):
        self.__product_stage = stage 
    def get_product_stage(self):
        return self.__product_stage
    def get_cash(self):
        pass

class NormalProductFactory(ProductFactory):
    def __init__(self,name,number,price,stage):
        super().__init__(name,number,price,stage)
        self.cs = CashNormal()

    def get_cash(self):
        return self.cs.accept_cash(self.get_product_price())

class RebateProductFactory(ProductFactory):
    def __init__(self,name,number,price,stage):
        super().__init__(name,number,price,stage)
        self.cs = CashRebate()
        self.cs.cash_rebate("0.8")

    def get_cash(self):
        return self.cs.accept_cash(self.get_product_price())

class ReturnProductFactory(ProductFactory):
    def __init__(self,name,number,price,stage):
        super().__init__(name,number,price,stage)
        self.cs = CashReturn()
        self.cs.cash_return("300","100")

    def get_cash(self):
        return self.cs.accept_cash(self.get_product_price())

# 策略模式上下文类实现
class CashContext(object):
    def __init__(self,name,number,price,stage,typ):
        if typ == "正常收费":
            self.product = NormalProductFactory(name,number,price,stage)
        elif typ == "打8折":
            self.product = RebateProductFactory(name,number,price,stage)
        elif typ == "满300返100":
            self.product = ReturnProductFactory(name,number,price,stage)
    def get_type(self):
        return self
    def get_result(self):
        return self.product.get_cash()

采用这种方式的商品,其产品的初始化需要采用:

product = CashContext("核桃",200,2,"上架中","满300返100")

这种方式。

2.2 商品上架审核

这部分非常明显,需要采用职责链模式:

# -*- coding:utf-8 -*-
class Request(object):
    __product = None
    def get_product(self):
        return self.__product
    def set_product(self,product):
        self.__product = product
    product = property(get_product,set_product)

# 商品审核
class ProductVerify(object):
    __organ = None   # 审核组织
    __stage_tag = None
    __superior = None
    def set_organ(self,organ):
        self.__organ = organ
    def get_organ(self):
        return self.__organ
    def set_stage_tag(self,stage_tag):
        self.__stage_tag = stage_tag
    def get_stage_tag(self):
        return self.__stage_tag
    def set_superior(self,superior):
        self.__superior = superior
    def get_superior(self):
        return self.__superior
    def request_applications(self,request:Request):
        pass
    organ = property(get_organ,set_organ)
    stage_tag = property(get_stage_tag,set_stage_tag)
    superior = property(get_superior,set_superior)

# 库存中心
class StockCenter(ProductVerify):
    def __init__(self):
        self.organ = "库存中心"
    def request_applications(self,request:Request):
        print(f"{request.product}上架经过了{self.organ}批准!")
        self.stage_tag = "上架中"
        print(f"{request.product}此时处于{self.stage_tag}的状态")
        self.superior.request_applications(request)

# 销售中心
class SalesCenter(ProductVerify):
    def __init__(self):
        self.organ="销售中心"
    def request_applications(self,request:Request):
        print(f"{request.product}上架经过了{self.organ}批准!")
        self.stage_tag = "上架中"
        print(f"{request.product}此时处于{self.stage_tag}的状态")
        self.superior.request_applications(request)

# 经理
class Manager(ProductVerify):
    def __init__(self):
        self.organ="经理"
    def request_applications(self,request:Request):
        print(f"{request.product}上架经过了{self.organ}批准!")
        self.stage_tag = "在售"
        print(f"{request.product}此时处于{self.stage_tag}的状态")

在调用时,需要先对职责链进行组装,然后再来发送相应请求:

# 组装责任链
stockCenter = StockCenter()
salesCenter = SalesCenter()
manager = Manager()
stockCenter.set_superior(salesCenter)
salesCenter.set_superior(manager)

request = Request()
request.product = "香蕉"
stockCenter.request_applications(request)

在这里插入图片描述
剩下的就是拼接组装了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sqlite wal 分析

动手点关注干货不迷路sqlite 提供了一种 redo log 型事务实现,支持读写的并发,见 write-ahead log(https://sqlite.org/wal.html)。本文将介绍 wal 原理,并源码剖析 checkpoint 过程,同时讨论下 wal 使用中…

知行之桥EDI系统如何通过ZIP端口压缩文件?

在EDI项目当中,对于IT技术不够成熟或设备不够完善的用户来说,EXCEL方案是较为适中的选择。收到合作伙伴发来的850订单之后,将订单数据转换为EXCEL,再将EXCEL发送至用户指定的邮箱。若每条订单单独发送至邮箱,当订单量大…

#榜样的力量#《新冠战“疫”——2022中国数据智能产业最具社会责任感企业》榜正式发布...

‍数据猿出品数据猿此次推出的#榜样的力量#《新冠战“疫”——2022中国数据智能产业最具社会责任感企业》榜单/奖项为公益主题策划活动。旨在为正能量助威,为中国数据智能产业中具有社会责任感的典型性企业发声。数据智能产业创新服务媒体——聚焦数智 改变商业新冠…

66、【链表】leetcode——142. 环形链表 II(C++、Python版本)

题目描述 方法一:哈希表 C版本 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *detectCycle(ListNode *head) {unord…

年终小结:苟住

大家好,我是一哥,新的一年又要到来了,一个词总结下今年的状态 01 工作 2022真的比较难,作为互联网技能从业人员,相信大家一定经历了很多。这一年虽然我没有被毕业,但也经历了公司的业务调整,曾…

C51 --串口通信

3.2.1 串口的连接方式 RXD:数据输入引脚,接受数据;STC89系列对应P3.0口,上官一号有单独引出 TXD: 数据发送引脚,数据发送;STC89系列对应P3.0口,上官一号有单独引出 接线方式&…

2022 IoTDB Summit:IoTDB PMC 田原《大规模并行处理与边缘计算在 Apache IoTDB 中的实践》...

12 月 3 日、4日,2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本,并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例,深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

带头双向循环链表的增删改查

目录🤡前言😊带头双向循环链表👍链表实现😠插入-头插,尾插,随机插✅删除-头删,尾删,随机删😂链表搜索和链表修改💡总结🤡前言 本篇博客主要是介绍…

Qt编写雷达模拟仿真工具(模拟点/歼击机/航母/发射导弹/爆炸效果/激光雷达等)

一、简单介绍 雷达模拟仿真工具,主要通过模拟点模拟相关物体,方位、航向角、距离、速度,并且显示相关详情信息可建立跟踪线建立与模拟点联系。可自定义更换模拟点背景达到更加逼真效果,如歼击机,航母发射导弹效果&…

单例模式,适配器模式,迭代器模式,工厂模式(C++实现)

设计模式就相当于编程中的“孙子兵法”,是经过很久的时间以及各路大神总结出来的多种实用,高效的业务设计中的套路; 单例模式 一个类只能创建一个对象的情况下的一种设计模式(eg:服务器只有一个),即单例模…

【论文阅读】《知识图谱研究综述》;Knowledge Graph:概念及主要应用,主要特征、构建的主要技术、未来研究方向。

目录 1. 文章来源2. 简介3. 什么是知识图谱4. Knowledge Graph 主要特征5. Knowledge Graph 构建的主要技术6. Knowledge Graph 未来研究方向1. 文章来源 该paper来自于知网,请尊重原创,这里仅作为学习笔记~ 2. 简介 知识图谱将知识库以一种图谱的形式展现出来,使知识具有…

opencv-python常用函数解析及参数介绍(一)——图像读取及其通道与灰度

opencv-python中一些常用函数解析及参数介绍前言1.读图片读彩图读灰度图2.显示图片显示彩图显示灰度图灰度图与彩图的区别从彩图中分离单通道通道合并3.保存图片4.灰图的通道分离5.读取视频前言 本文将简单介绍opencv-python中的图像以及视频的读取,并且介绍灰度图…

Hello 2023

年初到年尾,感觉刚写完《Hello 2022》,就要迎接2023了。今天是2022最后一天,本来是元旦假期的第一天,奈何要来公司加班,抽个时间来回顾下 2022 吧。 2022 年和2021 一样也是里程碑的一年,完成了两件大事&a…

使用CSS提高网站性能的30种方法

根据httparchive.org的页面重量报告,CSS在平均70个请求和2MB的网页上占7个HTTP请求和70Kb的代码。这并不是网站性能糟糕的最坏原因(我正看着你呢,JavaScript),但CSS面临着特定的挑战: CSS会阻止渲染&#x…

【C++进阶】多态

文章目录多态的概念多态的定义及实现抽象类多态的原理多继承和单继承关系中的虚表函数继承和多态常见的问题多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 …

我的2022年,一位双非生的平淡一年

没有白走的路,每一步都算数🎈🎈🎈 前言 一谈到年终总结,其实还是很多的遗憾,我和大部分人一样,走过这一年的路途,发现自己除去每年头发越来越少,脸色日渐不佳。好像没有什…

Web 和移动应用程序测试之间的区别

智能手机改变了人类与技术互动的方式。无论是旅行、健身、生活方式、视频游戏,甚至是服务,都只需触手可及(字面意思就是如此)。我们只需要看看越来越多的智能手机或平板电脑用户与桌面用户就可以掌握这一现实。 根据一项调查,从 2021 年 4 月…

Dubbo(尚硅谷)学习笔记3

这是我们正常启动: 现在我们去把zookeeper注册中心关掉。 此时我们的注册中心是用不了的。 但是我们的数据还有,也就是我们的消费者还是能调用我们的提供者中的方法。 那么我们现在来试一下dubbo直连,也就是没有注册中心,我们也可…

VideoRender和ImageRender中的一些c++知识点

1.inline C中的inline用法_路痴的旅行的博客-CSDN博客 1 引入inline关键字的原因在c/c中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数,栈空间就是…

深入理解计算机系统_静态链接和动态链接以及静态库和动态库

这篇文章记录静态链接和动态链接以及静态库和动态库的原理。 1 静态链接和动态链接 链接其实就是连接的意思,将所有相关的东西连接起来。 1.1 静态链接 什么是静态链接?编译时候的链接就是静态链接,所以ld/collect2链接程序,也…