STUNUM

面有萌色,胸有丘壑。心有猛虎,细嗅蔷薇。

嗨,我是王鑫 (@stunum),一名 Python 开发者。


Python web开发,后端以Django框架为主,前端使用Vue.js...

python设计模式之访问者模式

访问者模式

意义:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

举例:
class Finance(object):
    #财务数据结构类
    def __init__(self):
        self.salesvolume = None  # 销售额
        self.cost = None    # 成本
        self.history_salesvolume = None  # 历史销售额
        self.history_cost = None    # 历史成本

    def set_salesvolume(self, value):
        self.salesvolume = value

    def set_cost(self, value):
        self.cost = value

    def set_history_salesvolume(self, value):
        self.history_salesvolume = value

    def set_history_cost(self, value):
        self.history_cost = value

    def accept(self, visitor):
        pass


class Finance_year(Finance):
    #2018年财务数据类

    def __init__(self, year):
        Finance.__init__(self)
        self.work = []  # 安排工作人员列表
        self.year = year

    def add_work(self, work):
        self.work.append(work)

    def accept(self):
        for obj in self.work:
            obj.visit(self)


class Accounting(object):
    #会计类

    def __init__(self):
        self.ID = "会计"
        self.Duty = "计算报表"

    def visit(self, table):
        print(f'会计年度: {table.year}')
        print(f"我的身份是: {self.ID} 职责: {self.Duty}")
        print(f'本年度纯利润: {table.salesvolume - table.cost}')
        print('------------------')


class Audit(object):
    #财务总监类

    def __init__(self):
        self.ID = "财务总监"
        self.Duty = "分析业绩"

    def visit(self, table):
        print(f'会计总监年度: {table.year}')
        print(f"我的身份是: {self.ID} 职责: {self.Duty}")
        if table.salesvolume - table.cost > table.history_salesvolume - table.history_cost:
            msg = "较同期上涨"
        else:
            msg = "较同期下跌"
        print(f'本年度公司业绩: {msg}')
        print('------------------')


class Adviser(object):
    #战略顾问
    def __init__(self):
        self.ID = "战略顾问"
        self.Duty = "制定明年战略"

    def visit(self, table):
        print(f'战略顾问年度: {table.year}')
        print(f"我的身份是: {self.ID} 职责: {self.Duty}")
        if table.salesvolume > table.history_salesvolume:
            msg = "行业上行,扩大生产规模"
        else:
            msg = "行业下行,减小生产规模"
        print(f'本年度公司业绩: {msg}')
        print('------------------')


class Work(object):
    #工作类
    def __init__(self):
        self.works = []  # 需要处理的年度数据列表

    def add_work(self, obj):
        self.works.append(obj)

    def remove_work(self, obj):
        self.works.remove(obj)

    def visit(self):
        for obj in self.works:
            obj.accept()


if __name__ == '__main__':
    work = Work()  # 计划安排财务、总监、顾问对2018年数据处理
    # 实例化2018年数据结构
    finance_2018 = Finance_year(2018)
    finance_2018.set_salesvolume(200)
    finance_2018.set_cost(100)
    finance_2018.set_history_salesvolume(180)
    finance_2018.set_history_cost(90)
    accounting = Accounting()   # 实例化会计
    audit = Audit()  # 实例化总监
    adviser = Adviser()     # 实例化顾问
    finance_2018.add_work(accounting)   # 会计安排到2018分析日程中
    finance_2018.add_work(audit)    # 总监安排到2018分析日程中
    finance_2018.add_work(adviser)  # 顾问安排到2018分析日程中
    work.add_work(finance_2018) # 添加2018年财务工作安排
    work.visit()

输出结果:

会计年度: 2018
我的身份是: 会计 职责: 计算报表
本年度纯利润: 100
------------------
会计总监年度: 2018
我的身份是: 财务总监 职责: 分析业绩
本年度公司业绩: 较同期上涨
------------------
战略顾问年度: 2018
我的身份是: 战略顾问 职责: 制定明年战略
本年度公司业绩: 行业上行,扩大生产规模
------------------
最近的文章

python虚拟环境之pyenv

安装pyenvbrew install pyenv配置pyenv$ vim ~/.zshrc添加以下代码到.zshrc文件尾部eval "$(pyenv init -)"eval "$(pyenv virtualenv-init -)"然后使修改立即生效$ source ~/.zshrc使用pyenvUsage: pyenv <command> [<args>]Some useful pyenv commands are: commands List al...…

水滴石穿继续阅读
更早的文章

python设计模式之策略模式

策略模式意义:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。适应性: 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 一个系统需要动态地在几种算法中选择一种。 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。 举例: ```import types class People(object):de...…

水滴石穿继续阅读