前言

本文为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):passdef accept_cash(self,money):pass# 收费的具体类
class CashNormal(CashSuper):# 正常收费def accept_cash(self,money):return money
class CashRebate(CashSuper):# 打折收费__moneyRebate = 1def cash_rebate(self,moneyRebateStr):self.__moneyRebate = float(moneyRebateStr)def accept_cash(self,money):return money*self.__moneyRebate
class CashReturn(CashSuper):# 返利收费__moneyCondition = 0__moneyReturn = 0def cash_return(self,moneyConditionStr,moneyReturnStr):self.__moneyCondition = float(moneyConditionStr)self.__moneyReturn = float(moneyReturnStr)def accept_cash(self,money):result = moneyif (money >= self.__moneyCondition):result = money - money // self.__moneyCondition * self.__moneyReturnreturn result# 产品的抽象类
class ProductFactory(object):def __init__(self,name,number,price,stage):self.__product_name = nameself.__product_number = numberself.__product_price = priceself.__product_stage = stage# OnSale:在售;   OutOfStock:缺货;  InProcess:上架中。def set_product_name(self,name):self.__product_name = namedef get_product_name(self):return self.__product_namedef set_product_number(self,number):self.__product_number = numberdef get_product_number(self):return self.__product_numberdef set_product_price(self,price):self.__product_price = pricedef get_product_price(self):return self.__product_pricedef set_product_stage(self,stage):self.__product_stage = stage def get_product_stage(self):return self.__product_stagedef get_cash(self):passclass 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 selfdef get_result(self):return self.product.get_cash()

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

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

这种方式。

2.2 商品上架审核

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

# -*- coding:utf-8 -*-
class Request(object):__product = Nonedef get_product(self):return self.__productdef set_product(self,product):self.__product = productproduct = property(get_product,set_product)# 商品审核
class ProductVerify(object):__organ = None   # 审核组织__stage_tag = None__superior = Nonedef set_organ(self,organ):self.__organ = organdef get_organ(self):return self.__organdef set_stage_tag(self,stage_tag):self.__stage_tag = stage_tagdef get_stage_tag(self):return self.__stage_tagdef set_superior(self,superior):self.__superior = superiordef get_superior(self):return self.__superiordef request_applications(self,request:Request):passorgan = 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)


剩下的就是拼接组装了。

设计模式-牛刀小试02相关推荐

  1. 设计模式-牛刀小试01

    前言 本文为datawhale2022年12月组队学习<大话设计模式>task4打卡学习,本次完成homework1. [教程地址]https://github.com/datawhale ...

  2. Java设计模式学习02——工厂模式

    工厂模式 工厂模式主要是为创建对象提供接口,将创建对象的过程隔离起来,实现了创建者与调用者的分离,提高了程序的灵活性.  核心本质: 实例化对象,用工厂方法代替new操作. 将选择实现类.创建对象统一 ...

  3. python入门牛刀小试02

    #1. 山上有一口缸可以装50升水,现在有15升水.老和尚叫小和尚下山挑水,每次可以挑5升.问:小和尚要挑几次水才可以把水缸挑满?通过编程解决这个问题.提示: # # 用整型变量water表示水缸里的 ...

  4. 【java设计模式】-00目录

    开篇 [java设计模式]-01设计模式简介 创建型模式: [java设计模式]-02工厂模式(Factory Pattern) [java设计模式]-03抽象工厂模式(Abstract Factor ...

  5. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  6. 其他系统 对外接口设计_设计模式分类及设计原则

    点击蓝字,关注我们 01 概述 设计模式的基础是:多态. 学习设计模式将有助于更加深入地理解面向对象思想,让你知道: 1.如何将代码分散在几个不同的类中? 2.为什么要有"接口"? ...

  7. react 布局容器_如何使用容器模式开发React超能力

    react 布局容器 Hello everyone! ? 大家好! ? This time I'm going to tell you about this very useful pattern i ...

  8. 我的书架20110626

    No. 著者 题名 年 应还日期 应还时间 归还日期 归还时间 罚款 分馆 1 王坚 结网--互联网产品经理改变世界 2010 07/12/2011 23:50 06/26/2011 8:58 中文图 ...

  9. 专题总纲目录 计算机学科基础

    本系列文章主要是计算机学科基础相关知识,偏重基础,也是后面 Linux系统 和 安卓系统 两大领域的基础. 目录 1 计算机基础 2 操作系统 3 设计模式 4 openGL​​​​​​​ 1 计算机 ...

最新文章

  1. 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化
  2. 鹅厂2020暑期实习第三次一面
  3. mysql解压版怎么退出_mysql-8.0.15-winx64 解压版安装教程及退出的三种方式
  4. Outlook数据提取工具readpst
  5. java 聚合_Java聚合
  6. Shell命令-磁盘与文件系统之dumpe2fs、dump
  7. GaussDB(DWS)应用实践丨负载管理与作业排队处理方法
  8. heavy dark--读《《暗时间》》
  9. ElasticSearch2.1 基于空间位置geo_query距离计算
  10. 苹果cmsv10仿片库网PC+WAP美化高端免费自适应模板
  11. [深入研究4G/5G/6G专题-35]: URLLC-6-《中国联通5G URLLC技术白皮书3.0版本》解读-2-无线侧关键技术
  12. RS485通讯介绍(附批量测试思路)
  13. 基于 DSP+FPGA 的排爆机器人控制系统设计与实现
  14. ABBYY15版无水印免费Pdf编辑器
  15. EXCEL:两列数据的重复和非重复值(顺序打乱)
  16. 产品经理从专能到全能——不再虚无缥缈的用户体验
  17. 程序员需要了解的先秦文学
  18. 迪文工控触摸屏使用modbus功能
  19. 浮点运算单元(FPU)是什么?
  20. 万圣节html代码大全,方舟生存进化249万圣节新版本代码大全分享

热门文章

  1. wpf inkcanvas customink 毛笔效果
  2. 40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
  3. 游戏后端】游戏服务器端开发的一些建议
  4. 每日新闻简报 365资讯简报12条
  5. 如何科学应对新冠疫情
  6. SEM(Search Engine Marketing)–
  7. 从零开始java数据权限篇:数据权限
  8. jmeter接口测试流程
  9. 耳鸣常见的因素有哪些?
  10. 魔兽世界 - PKU[课程作业]程序设计与算法(三)C++面向对象程序设计/coursera C++程序设计_World of warcraft Project