1. 访问者模式(Visitor)介绍

UML类图

角色介绍

  • Visitor:接口或者抽象类,定义了对每个 Element 访问的行为,它的参数就是被访问的元素,它的方法个数理论上与元素的个数是一样的,因此,访问者模式要求元素的类型要稳定,如果经常添加、移除元素类,必然会导致频繁地修改 Visitor 接口,如果出现这种情况,则说明不适合使用访问者模式。
  • ConcreteVisitor:具体的访问者,它需要给出对每一个元素类访问时所产生的具体行为。
    Element:元素接口或者抽象类,它定义了一个接受访问者(accept)的方法,其意义是指每一个元素都要可以被访问者访问。
  • ConcreteElement:具体的元素类,它提供接受访问的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。
  • ObjectStructure:定义当中所提到的对象结构,对象结构是一个抽象表述,它内部管理了元素集合,并且可以迭代这些元素提供访问者访问。

2. 示例

  • Visitor模式是在补修改已有程序结构前提下,通过添加额外的访问者完成对代码功能的拓展。为什么这样用?当你的类层次较多,在某层结构中增加新的方法,要是在基类上面添加或者变更,可能破坏原来的设计,有兼容问题,所以只在需要的类上面动态添加。
  • 下面的例子,每个部件都有一个accept的方法接受我上面说的所谓’访问者’,而这个访问者以参数的方式传进来,但是其实他是一个含有一些功能的类的实例,它拥有很多个visit开头的方法对应不同的部件。这样就不需要修改这些部件,而只是修改我们的访问者类的相关部分。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-'''Visitor Pattern with Python Code
'''from abc import abstractmethod, ABCMeta# 定义一个表示元素(Element)的接口
class Element(metaclass=ABCMeta):@abstractmethoddef accept(self, visitor):pass@abstractmethoddef do_entry(self):pass# 定义一个表示访问者(Visitor)的接口
class Visitor(metaclass=ABCMeta):@abstractmethoddef visit_element1(self, e):pass@abstractmethoddef visit_element2(self, e):pass# 元素实体1
class ConcreteElement1(Element):def accept(self, visitor):visitor.visit_element1(self)def do_entry(self):print('This is Element 1')# 元素实体2
class ConcreteElement2(Element):def accept(self, visitor):visitor.visit_element2(self)def do_entry(self):print('This is Element 2')# 访问者实体
class ConcreteVisitor(Visitor):def visit_element1(self, visitor):visitor.do_entry()def visit_element2(self, visitor):visitor.do_entry()# 对象结构,迭代元素提供访问者访问
class ObjectStruture(object):def get_elements(self):_list = [ConcreteElement1(),ConcreteElement2()]return _listclass Client(object):def main(self):element_list = ObjectStruture().get_elements()for e in element_list:e.accept(ConcreteVisitor())if __name__ == '__main__':Client().main()

输出:

# ./Visitor.py
This is Element 1
This is Element 2

参考:
https://wiki.jikexueyuan.com/project/java-design-pattern/

python设计模式23-访问者模式相关推荐

  1. [设计模式] 23 访问者模式 visitor Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...

  2. C++设计模式23——访问者模式

    https://blog.csdn.net/CoderAldrich/article/details/83270301 访问者模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对 ...

  3. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  4. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  5. Python设计模式-中介者模式

    Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...

  6. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

  7. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  8. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  9. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  10. 北风设计模式课程---访问者模式(Visitor)

    北风设计模式课程---访问者模式(Visitor) 一.总结 一句话总结: 设计模式是日常问题的经验总结方案,所以学好设计模式对日常出现的问题可以有很好的解决. 访问者设计模式有点神似 抽象工厂模式, ...

最新文章

  1. 远程办公用什么软件比较好?
  2. 逻辑数据库读取bseg
  3. JZOJ 3129. 【WinterCamp 2013】数三角形
  4. GoldenGate系统二:快速搭建三方单向通信GoldenGate环境
  5. Java中已检查和未检查的异常
  6. 使用firefox44版本,弃用chrome
  7. TensorFlow:tensorflow之CIFAR10与ResNet18实战
  8. HTML5:一个拖拽网页元素的例子
  9. 算法:唯一路径Unique Paths 动态规划和二项系数解法
  10. npn三种波形失真_RF测试笔记:三阶交调失真概述及测试
  11. 程序员如何一键批量下载Iconfont图标
  12. WIN7系统下如何设置护眼设置
  13. HTML合并表格(单元格)
  14. android 音量流类型,android 音量控制setVolumeControlStream
  15. github配置SSH keys
  16. WIN7/WIN10/WIN11系统下触屏软键盘无法跟随跳出,桌面模式无法自动弹出(随动键盘)
  17. 三菱fx5u plc项目模板程序(含触摸屏程序) 程序注释全面,用的三菱fx5u系列plc和威纶触摸屏
  18. Word2003入门动画教程25:添加或改变Word页面边框
  19. 企业公众号推送什么内容?企业公众号内容可以发哪些?
  20. Docker更改镜像源

热门文章

  1. centos 字体的修改
  2. Shell脚本里调用Python程序
  3. 五大常用算法:分治、动态规划、贪心、回溯、分支限界
  4. Visual Studio 2010旗舰版正式版序列号 - civilman的专栏 - 博客频道 - CSDN.NET
  5. sendmail for linux
  6. 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
  7. Postgresql 8.2.15 安装文档
  8. nodemailer的使用
  9. 初识webpack——webpack四个基础概念
  10. ios7以后隐藏状态栏