python设计模式(二十三):访问者模式
访问者模式,数据结构中保存着许多元素,当改变一种对元素的处理方式但时,我们避免重复的修改数据类的结构,那我们在设计之初就将数据的处理分离,即数据类只提供一个数据处理的接口,而数据类的处理方法我们叫它访问者,那么相同结构的数据面临不同的处理结果时,我们只需要创建不同的访问者。
我们假设一种场景:上市公司的原始财务数据,对于会计来说需要制作各种报表,对于财务总监来说需要分析公司业绩,对于战略顾问来说需要分析行业变化,我们来实现这一过程。
class Finance:
"""财务数据结构类"""
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:
"""会计类"""
def __init__(self):
self.ID = "会计"
self.Duty = "计算报表"
def visit(self, table):
print('会计年度: {}'.format(table.year))
print("我的身份是: {} 职责: {}".format(self.ID, self.Duty))
print('本年度纯利润: {}'.format(table.salesvolume - table.cost))
print('------------------')
class Audit:
"""财务总监类"""
def __init__(self):
self.ID = "财务总监"
self.Duty = "分析业绩"
def visit(self, table):
print('会计总监年度: {}'.format(table.year))
print("我的身份是: {} 职责: {}".format(self.ID, self.Duty))
if table.salesvolume - table.cost > table.history_salesvolume - table.history_cost:
msg = "较同期上涨"
else:
msg = "较同期下跌"
print('本年度公司业绩: {}'.format(msg))
print('------------------')
class Adviser:
"""战略顾问"""
def __init__(self):
self.ID = "战略顾问"
self.Duty = "制定明年战略"
def visit(self, table):
print('战略顾问年度: {}'.format(table.year))
print("我的身份是: {} 职责: {}".format(self.ID, self.Duty))
if table.salesvolume > table.history_salesvolume:
msg = "行业上行,扩大生产规模"
else:
msg = "行业下行,减小生产规模"
print('本年度公司业绩: {}'.format(msg))
print('------------------')
class Work:
"""工作类"""
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
我的身份是: 战略顾问 职责: 制定明年战略
本年度公司业绩: 行业上行,扩大生产规模
------------------
上面年度可以实现:安排不同年份的财务报表给不同的角色分析,这就是访问者模式的魅力;访问者模式的核心是在保持原有数据结构的基础上,实现多种数据的处理方法,该方法的角色就是访问者。
访问者模式作为常用设计模式中难度最大的一种模式,他的难度在于高度的抽象,及其多层嵌套,需要细心的品味。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python五行代码解决滑块验证的缺口距离识别,破解滑块验证
目前网上关于滑块的缺口识别的方法很多,但是都不极简,看起来繁杂,各种算法的都有,有遍历的有二分法的,今天写个最简单,准确率最高的。 直接看代码: defFindPic(target,template): """ 找出图像中最佳匹配位置 :paramtarget:目标即背景图 :paramtemplate:模板即需要找到的图 :return:返回最佳匹配及其最差匹配和对应的坐标 """ target_rgb=cv2.imread(target) target_gray=cv2.cvtColor(target_rgb,cv2.COLOR_BGR2GRAY) template_rgb=cv2.imread(template,0) res=cv2.matchTemplate(target_gray,template_rgb,cv2.TM_CCOEFF_NORMED) value=cv2.minMaxLoc(res) 使用cv2库,先读取背景图,然后夜视化处理(消除噪点),然后读取模板图片,使用cv2自带图片识别找到模板在背景图中的位置,使用minMaxLoc提取出最佳匹配的最大值和最小值,返回...
- 下一篇
活体检测很复杂?仅使用opencv就能实现!(附源码)
什么是活体检测,为什么需要它? 随着时代的发展,人脸识别系统的应用也正变得比以往任何时候都更加普遍。从智能手机上的人脸识别解锁、到人脸识别打卡、门禁系统等,人脸识别系统正在各行各业得到应用。然而,人脸识别系统很容易被“非真实”的面孔所欺骗。比如将人的照片放在人脸识别相机,就可以骗过人脸识别系统,让其识别为人脸。为了使人脸识别系统更安全,我们不仅要识别出人脸,还需要能够检测其是否为真实面部,这就要用到活体检测了。 图1:左边的是真实脸,右边是假脸 目前有许多活体检测方法,包括: 纹理分析(Texture analysis),包括计算面部区域上的局部二进制模式(LBP)并使用SVM将面部分类为真脸或假脸; 频率分析(Frequency analysis),例如检查面部的傅里叶域; 可变聚焦分析(ariable focusing analysis)
相关文章
文章评论
共有0条评论来说两句吧...