python代码结构设计


参考链接:https://blog.csdn.net/hbu_pig/article/details/80431304
参考链接: google搜索对于设计模式的描述

其实最近才了解到代码的设计模式一些理念,正是因为项目中写的代码,可扩展性差,前后兼容困,导致‘牵一发 而动全身’的尴尬

创建型模式

工厂模式

抽象工厂模式

from abc import ABCMeta, abstractmethod


class CountryDeposit(metaclass=ABCMeta):
    """抽象工厂基类"""

    @abstractmethod
    def exchange_rate(self, usd):
        return usd

    @abstractmethod
    def screen_right_award(self, data):
        pass

    @abstractmethod
    def end_time(self, start_time):
        pass

    @property
    def old_award(self):
        return

    @property
    def new_award(self):
        return

    def check_tidb_flink_data(self, data):
         pass


class ZhangSanDepositRule(CountryDeposit):
    expire_time = 7 * 24 * 3600 * 1000
    activity_number = 87987099091

    def exchange_rate(self, usd):
        # 汇率转换:1AUD=0.65USD
        return round(usd / 1.14, 2)

    def screen_right_award(self, kafka_deposit_records):


        return ""

    def end_time(self, start_time):
        return ""

    @property
    def old_award(self):
        return ""

    @property
    def new_award(self):
        return ""

    def note_deposit_info(self, user_id, account, award_id, license, transaction_id, tidb_data):
        pass


class LiSiDepositRule(CountryDeposit):
    expire_time = 7 * 24 * 3600 * 1000
    expire_count = 3
    activity_number = 888888888

    def exchange_rate(self, USD):
        return round(USD / 0.65, 2)

    def screen_right_award(self, kafka_deposit_records):

        return ""

    def end_time(self, start_time):
        return ""

    @property
    def old_award(self):
        return ""

    @property
    def new_award(self):
        return ""


def deposit_rule_factory(ID):
    self_class = None
    if ID == "CHINA":
        # 中国
        self_class = ZhangSanDepositRule()
    elif ID == "US":
        # us
        self_class = LiSiDepositRule()
    elif ID in ["USA"]:
        # USA
        self_class = LiSiDepositRule()
    return self_class

结构型模式

适配器模式

装饰器模式

行为型模式

观察者模式

有时,我们希望在一个对象的状态改变时更新另外一组对象。在MVC模式中有这样一个非常常见的例子,假设在两个视图(例如,一个饼图和一个电子表格)中使用同一个模型的数据,无论何时更改了模型,都需要更新两个视图。这就是观察者设计模式要处理的问题。
观察者模式描述单个对象(发布者,又称为主持者或可观察者)与一个或多个对象(订阅者,又称为观察者)之间的发布—订阅关系。在MVC例子中,发布者是模型,订阅者是视图。然而,MVC并非是仅有的发布—订阅例子。信息聚合订阅(比如,RSS或Atom)是另一种例子。许多读者通常会使用一个信息聚合阅读器订阅信息流,每当增加一条新信息时,他们就能自动地获取到更新。
观察者模式背后的思想等同于MVC和关注点分离原则背后的思想,即降低发布者与订阅者之间的耦合度,从而易于在运行时添加/删除订阅者。此外,发布者不关心它的订阅者是谁。它只是将通知发送给所有订阅者。
在这里插入图片描述



class Publisher:
    def __init__(self):
        self.observers = {}

    def add(self, observer):
        if id(observer) not in self.observers.keys():
            self.observers.update({id(observer): observer})
        else:
            print("Failed to add: {}".format(observer))

    def remove(self, observer):
        try:
            self.observers.pop(id(observer))
        except ValueError:
            print("Failed to remove: {}".format(observer))

    def notify(self, obj):
        obj.notify(self)
        # [o.notify(self) for o in self.observers]
        # 这个例子中如果一个值改变就会通知所有类,但是根据实际业务来说,我只想实现一对一的通知,那么
        # 就自己改写一下此方法,就是修改观察者的下发模式,此处我已改掉


class DefaultFormatter(Publisher):
    def __init__(self, name):
        Publisher.__init__(self)
        self.name = name
        self._data = 0

    def __str__(self):
        return "{}: '{}' has data = {}".format(type(self).__name__, self.name, self._data)

    @property
    def data(self):
        return self._data

    @data.setter
    def data(self, new_value):
        try:
            self._data, obj = new_value
        except ValueError as e:
            print("Error: {}".format(e))
        else:
            self.notify(obj)


class HexFormatter:
    def notify(self, publisher):
        print("{}: '{}' has now hex data = {}".format(type(self).__name__, publisher.name, hex(publisher.data)))


class BinaryFormatter:
    def notify(self, publisher):
        print("{}: '{}' has now binary data = {}".format(type(self).__name__, publisher.name, bin(publisher.data)))


def main():
    df = DefaultFormatter('test1')
    print(df)

    print()
    hf = HexFormatter()
    df.add(hf)
    df.data = (3, hf)
    print(df)

    print()
    bf = BinaryFormatter()
    df.add(bf)
    df.data = (21, bf)
    print(df)

    print()
    df.remove(hf)
    df.data = (13,hf)
    print(df)


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值