网站首页 > 博客文章 正文
今日分享主题:Python 设计模式之访问者模式。
定义
访问者模式是指封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义于作用于这些元素的新操作。
应用场景
1、要遍历不同的对象,根据对象进行不同的操作的场景;
2、当一个对象被多个不同对象顺次处理的情况,可以考虑使用访问者模式;
3、报表生成器也可以使用访问者模式实现,报表的数据源由多个不同的对象提供,每个对象都是Visitor,报表这个Element顺次Accept各访问者完善并生成对象。
Python 代码实现
1class Person(object):
2 pass
3
4class Man(Person):
5 pass
6
7class Woman(Person):
8 pass
9
10class Girl(Woman,Man):
11 pass
12
13class Son(Man, Woman):
14 pass
15
16class Visitor(object):
17 def visit(self, person, *args, **kwargs):
18 meth = None
19 #为了方便且快速地看清继承关系和顺序,可以用__mro__方法来获取这个类的调用顺序。
20 for cls in person.__class__.__mro__:
21 # print(cls)
22 meth_name = 'visit_'+cls.__name__
23 # print("----",meth_name)
24 # print(self)
25 '''
26 这里讲解一下:Python的hasattr(),getattr(),setattr()函数使用方法
27 一:hasattr(object, name)
28 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。
29 二:getattr(object, name[,default])
30 获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
31 三:setattr(object, name, values)
32 给对象的属性赋值,若属性不存在,先创建再赋值。
33 '''
34 meth = getattr(self, meth_name, None)
35 if meth:
36 break
37
38 if not meth:
39 meth = self.generic_visit
40 return meth(person, *args, **kwargs)
41
42 #普通访问入口
43 def generic_visit(self, person, *args, **kwargs):
44 # 这里可以写处理逻辑
45 print('generic_visit '+person.__class__.__name__)
46
47 #妇女访问入口
48 def visit_Woman(self, person, *args, **kwargs):
49 # 这里可以写处理逻辑
50 print('visit_Woman '+person.__class__.__name__)
51
52 #男人访问入口
53 def visit_Man(self, person, *args, **kwargs):
54 # 这里可以写处理逻辑
55 print('visit_Man '+person.__class__.__name__)
56
57if __name__ == '__main__':
58 p=Person()
59 man = Man()
60 woman = Woman()
61 girl = Girl()
62 son = Son()
63
64 visitor = Visitor()
65 visitor.visit(p)
66 visitor.visit(man)
67 visitor.visit(son)
68 visitor.visit(woman)
69 visitor.visit(girl)
输出结果如下:
1generic_visit Person
2visit_Man Man
3visit_Man Son
4visit_Woman Woman
5visit_Woman Girl
备注
class Man(Person)--->这里会在类的继承关系中会指定调用visit_Man方法
class Son(Man,Woman)--->这里会在类的继承关系中优先找到并调用visit_Man方法
class Woman(Person)--->这里会在类的继承关系中会指定调用visit_Woman方法
class Girl(Woman,Man)--->这里会在类的继承关系中优先找到并调用visit_Woman方法
找到了对应的方法就可以执行对应的业务逻辑。
优点:
1、将不同的职责非常明确地分离开来,符合单一职责原则;
2、职责的分开也直接导致扩展非常优良,灵活性非常高,加减元素和访问者都非常容易。
猜你喜欢
- 2024-10-01 设计模式——备忘录模式(备忘录界面设计)
- 2024-10-01 设计模式 之 行为型模式(行为型设计模式特点)
- 2024-10-01 Go语言设计模式-访问者(go语言有设计模式吗)
- 2024-10-01 Spring Boot 实战:运用访问者模式灵活扩展订单处理逻辑
- 2024-10-01 visitor pattern 访问者模式(访问者模式工作原理)
- 2024-10-01 Aha!设计模式(105)-访问者模式(1)
- 2024-10-01 GOF设计模式(命令模式,访问者模式,迭代器模式,观察者模式)
- 2024-10-01 设计模式第2招第9式之解释器模式(解释器原理)
- 2024-10-01 设计模式第2招第1式之观察者模式(观察者设计模式的优点)
- 2024-10-01 「编程设计」访问者(Visitor)模式-补丁式为原体系增加新功能
你 发表评论:
欢迎- 07-07Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- 07-07Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- 07-07Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 07-07Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- 07-07IT运维必会的30个工具(it运维工具软件)
- 07-07开源项目有你需要的吗?(开源项目什么意思)
- 07-07自动化测试早就跑起来了,为什么测试管理还像在走路?
- 07-07Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- 最近发表
-
- Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- IT运维必会的30个工具(it运维工具软件)
- 开源项目有你需要的吗?(开源项目什么意思)
- 自动化测试早就跑起来了,为什么测试管理还像在走路?
- Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- Cursor 太贵?这套「Cline+OpenRouter+Deepseek+Trae」组合拳更香
- 为什么没人真的用好RAG,坑都在哪里? 谈谈RAG技术架构的演进方向
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)