博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python设计模式(二)--策略模式(中)
阅读量:6123 次
发布时间:2019-06-21

本文共 2508 字,大约阅读时间需要 8 分钟。

hot3.png

最近正在持续更新源码库,代码都是参考大话设计模式翻成python版,完整代码片段请到github上去下载.

https://github.com/zhengtong0898/python-patterns

 

参考:

    书籍<<大话设计模式>> 第二章 2.5  --  2.6 小节

 

Python 3.x

# -.- coding:utf-8 -.-# __author__ = 'zhengtong'# 知识点:面向对象的编程,并不是类越多越好,类的划分是为了封装,#         但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。_price_repr = '单价:'_number_repr = '数量:'_total_repr = '合计:'class Strategy:    """    策略和简单工厂的结合    这里将原来的CashFactory工厂中的代码进行了整合.    """    def __init__(self, typed, **kwargs):        if typed == 1:            self.result = CashNormal(**kwargs)        elif typed == 2:            self.result = CashReturn(300, 100, **kwargs)        elif typed == 3:            self.result = CashRebate(0.8, **kwargs)        else:            raise KeyError('无效的返利选择')    def get_result(self):        return self.result.accept_cash()class CashSuper:    """现金收取类(抽象类)"""    def __init__(self, money):        self.money = money    def accept_cash(self):        raise NotImplementedErrorclass CashNormal(CashSuper):    """正常收费子类"""    def accept_cash(self):        return self.moneyclass CashRebate(CashSuper):    """打折收费子类"""    def __init__(self, rebate, **kwargs):        """        这里为什么采用**kwargs, 请参考下面这个链接:        http://my.oschina.net/zhengtong0898/blog/670917        """        super(CashRebate, self).__init__(**kwargs)        self.rebate = rebate    def accept_cash(self):        return self.money * self.rebateclass CashReturn(CashSuper):    """返利收费子类"""    def __init__(self, condition, money_return, **kwargs):        super(CashReturn, self).__init__(**kwargs)        self.condition = int(condition)        self.money_return = int(money_return)    def accept_cash(self):        result = self.money        # 当满足了返利条件, 则采用计算规则.        if self.money >= self.condition:            result = self.money - int(self.money / self.condition) * self.money_return        return resultdef main():    result = 0    while True:        try:            prices = int(input(_price_repr))            number = int(input(_number_repr))            price_off = int(input('返利模式: 1(正常收费), 2(满300返100), 3(打8折):'))            money = Strategy(price_off, money=prices*number).get_result()            result += money            print(_price_repr, prices, _number_repr, number, _total_repr, money)        except KeyboardInterrupt:            print('')            print('oops: 检测到Ctrl + C组合键, 正在返回总费用并推出程序')            break    return resultif __name__ == '__main__':    print('温馨提示:输入Ctrl + C组合键可得到总数和退出程序.')    print(main())

 

转载于:https://my.oschina.net/zhengtong0898/blog/673598

你可能感兴趣的文章
科技巨头的交通争夺战
查看>>
当中兴安卓手机遇上农行音频通用K宝 -- 卡在“正在通讯”,一直加载中
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
直播视频流技术名词
查看>>
网易跟贴这么火,背后的某个力量不可忽视
查看>>
企业级java springboot b2bc商城系统开源源码二次开发-hystrix参数详解(八)
查看>>
java B2B2C 多租户电子商城系统- 整合企业架构的技术点
查看>>
IOC —— AOP
查看>>
比特币现金将出新招,推动比特币现金使用
查看>>
数据库的这些性能优化,你做了吗?
查看>>
某大型网站迁移总结(完结)
查看>>
mysql的innodb中事务日志(redo log)ib_logfile
查看>>
部署SSL证书后,网页内容造成页面错误提示的处理办法
查看>>
MS SQLSERVER通用存储过程分页
查看>>
60.使用Azure AI 自定义视觉服务实现物品识别Demo
查看>>
Oracle 冷备份
查看>>
jq漂亮实用的select,select选中后,显示对应内容
查看>>