文档章节

python设计模式(二)--策略模式(中)

极光火狐狸
 极光火狐狸
发布于 2016/05/11 18:25
字数 482
阅读 39
收藏 0

最近正在持续更新源码库,代码都是参考大话设计模式翻成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 NotImplementedError


class CashNormal(CashSuper):
    """正常收费子类"""

    def accept_cash(self):
        return self.money


class 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.rebate


class 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 result


def 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 result

if __name__ == '__main__':
    print('温馨提示:输入Ctrl + C组合键可得到总数和退出程序.')
    print(main())

 

© 著作权归作者所有

共有 人打赏支持
极光火狐狸
粉丝 11
博文 29
码字总数 14739
作品 0
普陀
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0
python 与设计模式 ——工厂与单例

python 与设计模式 源码地址:[http://git.oschina.net/duoduo3_69/python_design_pattern][1] git checkout v001(这个版本与此篇博客相符) zarkpy里面运用了很多设计模式,以前一直很费解p...

duoduo3_69
2013/11/27
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
每天一个设计模式之订阅-发布模式

博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用(靠这吃饭)和(纯粹喜欢)两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :)...

godbmw
12/10
0
0
炒冷饭系列:设计模式 抽象工厂模式

炒冷饭系列:设计模式 抽象工厂模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是抽象工厂模...

泥沙砖瓦浆木匠
2014/07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

基础编程题目集-7-13 日K蜡烛图

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开...

niithub
18分钟前
0
0
Jenkins window 下的安装使用

1.下载:https://jenkins.io/download/ 双击安装完毕,将自动打开浏览器: http://localhost:8080 打开对应位置的文件,将初始密钥粘贴至输入框。 第一个是 安装默认的软件;第二个是 自定义...

狼王黄师傅
20分钟前
1
0
深入解析react关于事件绑定this的四种方式

这篇文章主要介绍了详解react关于事件绑定this的四种方式,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 在react组件中,每个方...

前端攻城小牛
29分钟前
1
0
JS正则表达式

url的正则表达式:包括IP,域名(domain),ftp,二级域名,域名中的文件,域名加上端口!用户名等等信息 `function` `IsURL(str_url) {``var` `strRegex =``"^((https|http|ftp|rtsp|mm...

前端小攻略
33分钟前
1
0
shell习题_2

find /root/ceshi1/ -type f -name "*.txt"|xargs -i mv {} {}.bak find /root/ceshi1/ -type f -name "*.txt" -exec mv {} {}.bak \; 1、批量修改文件名: n1=`echo $f|sed '#.bak##'` [ro......

芬野de博客
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部