广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 设计模式行为型访问者模式
  • 279
分享到

Python 设计模式行为型访问者模式

2024-04-02 19:04:59 279人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、访问者模式(Visitor Pattern)二、应用场景三、代码示例一、访问者模式(Visitor Pattern) 数据结构中保存着许多元素,当我们希望改变一种对元素的处理

一、访问者模式(Visitor Pattern)

数据结构中保存着许多元素,当我们希望改变一种对元素的处理方式时,要避免重复的修改数据结构。那么就要求我们在实现代码时,将数据的处理进行分离,即:数据类只提供一个数据处理的接口,而该数据处理接口就被称之为访问者。那么,相同结构的数据面临不同的处理结果时,我们只需要创建不同的访问者。

访问者模式,指作用于一个对象结构体上的元素的操作。访问者可以使用户在不改变该结构体中的类的基础上定义一个新的操作。

优点:

  • 使得在访问者类中针对复杂类结构中的某个类添加新方法较为容易,即:只需要简单地添加一个新的访问者方法即可。如果不采用访问者模式,这需要在每个类中添加一个新的方法。
  • 访问者将相关的方法集中在一个具体的访问者类中,而其他相关的方法集中在另外一个具体的访问者类中。也就是说,访问者子类是按照方法的类型来分类的。

缺点:

  • 增加一个具体的新 ConcreteElement 类比较困难。因为此时需要在每一个 ConcreteVisitor 类中添加该 ConcreteElement 类的访问方法。

二、应用场景

当一个对象的结构中,包含有多种类型的具有不同接口的对象,且用户要在这些对象上进行依赖于具体的类的运算时,需要用到访问者模式。这就是为什么访问者模式要针对每个被访问的子类都设计一个不同的接口的原因。事实上,如果每个被访问的子类都有相同的接口,包括构造方法、其他方法、参数都一致,则访问者类只需要设计一个访问方法,在该方法中含有一个用于区别不同的被访问的子类的参数即可。例如:可以使用被访问者基类作为参数类型。在对象的结构中包含有多种类型的有不同接口的对象时,各个不同的访问方法可能为访问所对应的类提供不同的参数类型。

当有多个不同的并且互不相关的运算将作用到这些对象上,而用户不希望这些运算混淆这些类时,可以使用访问者模式将相关的操作放到独立的类中,例如:为了实现每个结点类中的计算价格方法,可以将所有的计算价格方法放到一个 VisitPrice 类中。

在对象的数据类型很少改变,但是需要经常改变操作或者增加新的操作的情况下,可以使用访问者模式。反之,如果 Element 的子类经常改变结构,例如:需要增加一个新的税种,这就需要在访问者类中增加新的访问方法,因此,在这种情况下使用访问者模式代价较高,尽量不要使用访问者模式。

三、代码示例

该类图包含两个系列的类:“Element 类” 和 “访问者类”,访问者类定义了施加于 Element 类上的操作,为 Element 类提供一些功能。可以有多种具体的访问者类,各自完成特定的目的,如一个访问者类是计算价格,另一个访问者类则是计算存货数量。因此需要定义一个抽象的访问者父类 Visitor 以及用于各种特殊目的具体的子类。Visitor 类必须给每个结点类提供一个操作,即访问方法,例如获得各结点所代表的商品对象的价格等。

实体角色组成:

  • Visitor:为每个 Element 的对象声明一个访问操作。该访问操作的名字最好要包含被访问的类的名字,以便确认该访问操作是专门针对哪个具体的类,如:visitFamilyNoChildren 是专门为了服务类 FamilyNoChildren 的。
  • ConcreteVisitor:实现 Visitor 声明的运算。每个运算实现为对应的类的对象定义的算法的一部分。ConcreteVisitor 提供算法的环境并且存储其局部状态。
  • Element:定义了一些基本的方法,其中包含提供基本数据的方法,例如一些 get()与 set()方法。重要的是,每个 Element 子类都必须定义一个接收者方法,该方法以 Visitor 为参数类型:Accept(Visitor),其作用是为被访问者对象和访问者对象之间的交互提供接口。
  • ConcreteElement:具体的 Element 的子类,例如 ElementA,该类包含一个 accept 方法接收访问者对象。另外,该类还可能定义一些其他的方法以帮助访问者实现一些功能。
  • ObjectStructure:提供一个高层接口,允许访问者访问 Element 的子类。在该类中可以包含一个结构,例如 ArrayList、Vector 等,提供所要访问的 element 的列表。

示例:上市公司的原始财务数据:

  • 对于会计来说需要制作各种报表
  • 对于财务总监来说需要分析公司业绩
  • 对于战略顾问来说需要分析行业变化
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()

到此这篇关于python 设计模式行为型 访问者模式的文章就介绍到这了,更多相关Python访问者模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python 设计模式行为型访问者模式

本文链接: https://www.lsjlt.com/news/138329.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python 设计模式行为型访问者模式
    目录一、访问者模式(Visitor Pattern)二、应用场景三、代码示例一、访问者模式(Visitor Pattern) 数据结构中保存着许多元素,当我们希望改变一种对元素的处理...
    99+
    2022-11-13
  • .Net行为型设计模式之访问者模式(Visitor)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、访问者模式的代码实现六、访问者模式的实现要点:(1)、访问者模式的主要优点有...
    99+
    2022-11-13
  • Python设计模式行为型观察者模式
    目录一、观察者模式二、应用场景三、代码示例一、观察者模式 观察者模式,必须包含 “观察者” 和 “被观察者” 这两个角色,并且观察者和...
    99+
    2022-11-13
  • Java设计模式之访问者模式
    大多数情况下你不需要访问者模式,但当一旦需要访问者模式时,那就是真的需要它了,这是设计模式创始人的原话。可以看出应用场景比较少,但需要它的时候是不可或缺的,这篇文章就开始学习最后一个...
    99+
    2022-11-13
    Java 设计模式 访问者模式
  • 轻松掌握python设计模式之访问者模式
    本文实例为大家分享了python访问者模式代码,供大家参考,具体内容如下 """访问者模式""" class Node(object): pass class A(Node): pass c...
    99+
    2022-06-04
    模式 访问者 轻松
  • .Net行为型设计模式之观察者模式(Observer)
    目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、观察者模式的代码实现六、观察者模式的实现要点:1、观察者模式的优点:2、观察者模式的缺点:七、.N...
    99+
    2022-11-13
  • .Net行为型设计模式之中介者模式(Mediator)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、中介者模式的代码实现六、中介者模式的实现要点:1、中介者模式的优点2、中介者...
    99+
    2022-11-13
  • Python设计模式行为型责任链模式
    目录一、责任链模式二、应用场景三、代码示例一、责任链模式 责任链模式,将多个处理方法连接成一条链条,请求将在这条链条上流动直到该链条中有一个节点可以处理该请求。通常这条链条是一个对象...
    99+
    2022-11-13
  • Python 设计模式行为型解释器模式
    目录一、解释器模式二、应用场景三、代码示例一、解释器模式 解释器模式,开发者自定义一种 “有内涵” 的语言(或者叫字符串),并设定相关的解释规则,输入该字符串...
    99+
    2022-11-13
  • Java设计模式之java访问者模式详解
    目录介绍定义及使用场景UML类图角色财务案例个人心得体会静态分派以及动态分派静态分派动态分派访问者模式中的伪动态双分派 对访问者模式的一些思考总结优点缺点适用性参考文章总结介绍 ...
    99+
    2022-11-12
  • Python设计模式中的行为型策略模式
    目录一、策略模式二、应用场景三、代码示例一、策略模式 策略模式中,首先定义了一系列不同的算法,并把它们一一封装起来,然后在策略类中,使这些算法可以相互替换。这意味着,让一个类的行为(...
    99+
    2022-11-13
  • 深入理解Java设计模式之访问者模式
    目录一、什么是访问者模式二、访问者模式的结构三、访问者模式的使用场景四、访问者模式的优缺点五、访问者模式的实现总结一、什么是访问者模式 定义:表示一个作用于其对象结构中的各元素的操作...
    99+
    2022-11-12
  • .Net行为型设计模式之中介者模式怎么实现
    这篇文章主要介绍“.Net行为型设计模式之中介者模式怎么实现”,在日常操作中,相信很多人在.Net行为型设计模式之中介者模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.Net行为型设计模式之中介者...
    99+
    2023-06-30
  • 举例讲解Python设计模式编程中的访问者与观察者模式
    访问者模式 我觉得Visitor模式是在补修改已有程序结构前提下,通过添加额外的访问者完成对代码功能的拓展 为什么这样用?当你的类层次较多,在某层结构中增加新的方法,要是在基类上面添加或者变更,可能破坏原来...
    99+
    2022-06-04
    模式 观察者 访问者
  • Java设计模式之初识行为型模式
    目录一、行为型模式二、模板方法模式2.1 例子2.2 模板方法使用场景三、策略模式3.1 例子3.2 使用场景四、状态模式五、中介者模式六、观察者模式6.1 使用场景一、行为型模式 ...
    99+
    2022-11-12
  • Python 设计模式中的创建型建造者模式
    目录一、建造者模式二、代码示例一、建造者模式 建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修)...
    99+
    2022-11-13
  • .Net行为型设计模式之命令模式(Command)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、命令模式的代码实现六、命令模式的实现要点:1、命令模式的优点:2、命令模式的...
    99+
    2022-11-13
  • .Net行为型设计模式之状态模式(State)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、状态模式的代码实现六、状态模式的实现要点:1、状态模式的优点2、状态模式的缺...
    99+
    2022-11-13
  • 行为型设计模式 - 备忘录模式详解
    |0基本介绍备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态2|0模式结构Originator(发起者):记录当前的状态,负责创...
    99+
    2023-06-04
  • .Net行为型设计模式之策略模式(Stragety)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、策略模式的代码实现六、策略模式的实现要点:1、策略模式的主要优点有:2、策略...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作