文档章节

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

极光火狐狸
 极光火狐狸
发布于 2016/05/11 18:25
字数 482
阅读 37
收藏 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
普陀
《 Head First 》学习笔记:策略模式 (python实现)

学习<head first>,书中是用java 来实现,我用python比较多,所以在这里记下 用python实现的方法 。 书中策略模式的定义 : 策略模式 : 策略模式定义了算法族,分别封装起来,让它们之间可以...

Jbryan
2013/06/13
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
Python学习:19.Python设计模式-单例模式

一、单例模式存在的意义   在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什...

BD-ld-2017
07/31
0
0
【设计模式笔记】(十六)- 代理模式

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

MrTrying
06/24
0
0
Python新式类 new init 单例模式与作用域(四)

1 新式类与旧式类 新式类拥有经典类的全部特性之外,还有一些新的特性,比如 发生变化,新增了静态方法,python3目前都采用新式类,新式类是广度优先,旧式类是深度优先 (2)类的方法 静态方法 类方...

善良小郎君
06/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

cacti监控安装

cacti是用PHP实现的一个软件,它用snmp服务获取数据,然后用rrdtool存储和更新数据,并生成图表展示。比较适合用于交换机、路由器的网络监控,插件众多,可图示化显示网络状况。 cacti官方推...

hiwill
18分钟前
1
0
shell特殊符号、cut、sort、uniq、wc、tee、tr、split命令

10月15日任务 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下 cut 命令 cut作用:截取字符串 用法如下:cat /etc/passwd |head -2 |cut -d ...

hhpuppy
47分钟前
1
0
Springboot实现filter拦截token验证和跨域

背景 web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需要引入其...

funnymin
今天
3
0
linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
2
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部