`
zhangweieye
  • 浏览: 8934 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式学习笔记(二十一:访问者模式)

 
阅读更多

1.1概述

    表示将一个作用于某对象结构中的各个元素的操作。它可以在不改变各个元素的类的前提下定义作用于这些元素的新操作。这就是访问者模式的定义。

    编写类的时候,可能在该类中编写了若干个实例方法,该类的对象通过调用这些实例方法操作其成员变量表明所产生的行为。在某些设计中,可能需要定义作用于类的成员变量的新操作,而且这个新操作不应当由该类中的某个实例方法来承担。

  例如,有一个电表(Ammeter)类,在电表类中,electricAmount成员变量的值表示用电量,showElectricAmount()方法返回electricAmount变量的值来收取电费。现在的问题是:希望根据用电量来计算电费,即根据electricAmount变量的值来收取电费。显然,不应该在Ammeter类中增加计算电费的方法(单表本身不能计算出电费)。在实际生活中,应当由物业部门的“计表员”观察电表的用电量,然后按着有关收费标准计算出电费。访问者模式建议让一个称作访问者的对象访问Ammeter对象(电表),以便定义作用于Ammeter对象上的操作。在访问者模式中,“计表员”是AmmeterVisitor类的实例,称作Ammeter类实例的访问者,AmmeterVisitor类中有一个计算电费的方法:

void visit(Ammeter ammeter);

  该方法的参数是Ammeter类的实例,因此只要将Ammeter类的实例传递给该方法的参数,AmmeterVisitor类的实例就可以计算出电费(PS:假设1度点0.88元):

double visit(Ammeter ammer){

  charge = ammeter.showElectricAmount()*0.88;

  return charge;

}

  按着访问者模式,应当在Ammeter类中增加一个接受访问者的方法。Ammeter类中接受访问者的方法可如下定义:

void accept(AmmeterVisitor v){

  v.visit(this);          //将自身传递给参数指定的访问者

}

  因此,一个Ammeter类的实例通过调用accept()方法,并向该方法传递一个访问者,即AmmeterVisitor的实例,然后Ammeter类的实例再将自身传递给访问者就可以知道自己需要交纳多少电费了。AmmeterAmmeterVisitor类的类图如下图一所示:

 

图一:有关缴纳电费关系类图(PS:类图画的有点不规范,仅作参考哦)

   Ammeter类有了接受访问者的accept(AmmeterVisitor visitor)方法后,可以不改变Ammeter类就能定义作用于Ammeter对象的成员变量上的新操作,比如,可以让accept(AmmeterVisitor visitor)的参数是AmmeterVisitor类的一个实例,该实例布局根据Ammeter对象的成员变量计算出正常的电费,而且还可以计算超电量应缴纳的额外电费。

 

 

1.2模式的结构

访问者模式包括以下五种角色:

(1)抽象元素(Element):一个抽象类,该类定义了接受访问者的accept操作。

(2)具体元素(Concrete Element):Element的子类。

(3)对象结构(Object Structure):一个集合,用于存放Element对象,提供遍历它自己的方法。

(4)抽象访问者(Visitor):一个接口,该接口定义操作对象(Concrete Element的实例)的方法。

(5)具体访问者(Concrete Visitor):实现Visitor接口的类。

访问者模式结构的类图如下图二所示:

 

图二:访问者模式的类图(PS:类图画的有点不规范,仅作参考哦)

 

 

1.3访问者模式的优点

1)可以在不改变一个集合中元素类的情况下,增加新的施加于该元素上的新操作。

2)可以将集合中各个元素的某些操作集中到访问者中,不仅便于集合的维护,也有利于集合中元素的复用。

 

 

1.4适合使用访问者模式的情景

(1)一个对象结构中,比如某个集合中,包含有很多对象,想对集合中对象增加新的操作。

(2)需要对集合中的对象进行很多不同并且不相关的操作,而又不想修改对象的类,就可以使用访问者模式。访问者模式可以在Visitor类中集中定义一些关于集合中对象的操作。

分享到:
评论

相关推荐

    尚硅谷设计模式源码笔记课件.zip

    行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    3. 行为型模式:行为型模式关注对象之间的通信和协作,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。这些模式可以帮助...

    java-design-patterns:Java 设计模式学习笔记

    Java Design PatternsJava 设计模式学习笔记,简单易懂,每个模式都有相应的代码示列,帮助学习理解。在线阅读地址:设计原则创建型模式作用:将创建与使用代码解耦结构型模式作用:将不同的功能代码解耦桥接模式...

    java-patterns:Java 23种基本的设计模式整料整理学习,责任链模式过滤器,工厂模式BeanFactory,观察者模式ContextListen等。结合Spring源码理解学习

    describe:设计模式学习笔记 逻辑结构图 代码结构图 设计模式简述 创建型模式,共五种:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式,共七种:适配器模式,装饰器模式,代理模式,...

    J2EE学习笔记(J2ee初学者必备手册)

    Unix 学习笔记7 一、Unix前言............7 二、Unix基础知识....7 三、Unix常用命令....8 四、 文件系统权限.21 五、软硬连接的区别..........................22 六、范例程序...........22 七、网络基本命令...26...

    Java/JavaEE 学习笔记

    作者在杰普学习时的学习笔记,是J2ee初学者必备手册,是大家学习J2EE开发的很好的参考笔记。 Java/JavaEE 学习笔记 内容目录: Unix 学习笔记..........7 一、Unix前言............7 二、Unix基础知识....7 三、...

    左程云leetcode-hjLearningNotes:hj学习笔记

    第一部分:设计模式 & UML 简单工厂 工厂方法模式 抽象工厂模式 策略模式 责任链模式 命令模式 模板方法模式 适配器模式 代理模式 外观模式 组合模式 装饰模式 享元模式 桥接模式 Builder模式 状态模式 解释器模式 ...

    leetcode下载-LearningNotes:学习笔记

    访问者模式 中介者模式 组合模式 装饰模式 享元模式 桥接模式 ##第二部分 ##第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 ##第四部分 ##第五...

    leetcode下载-LearnNote:学习笔记

    访问者模式 中介者模式 组合模式 装饰模式 享元模式 桥接模式 第二部分 第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 第四部分 第五部分 第六...

    leetcode下载-AndroidLearningNotes:Android学习笔记

    访问者模式 中介者模式 组合模式 装饰模式 享元模式 桥接模式 第二部分 第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 第四部分 第五部分 第六...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    java-design-patterns:java 学习模式

    Java Design Patterns 学习笔记 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    2009 达内Unix学习笔记

    rm –f 文件 只要是该文件或者目录的拥有者,无论是否有权限删除,都可以用这个命令参数强行删除。 rm -rf * 删除所有文件及目录 rmdir 删除空目录。只可以删除空目录。 ln 创建硬链接或软链接,硬链接=同一文件的...

    leetcode下载-LearningNote:学习笔记

    访问者模式 中介者模式 组合模式 装饰模式 享元模式 桥接模式 第二部分 第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 第四部分 第五部分 第六...

    leetcode下载-LearningnNotes:学习笔记

    访问者模式 中介者模式 组合模式 装饰模式 享元模式 桥接模式 ##第二部分 ##第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 ##第四部分 ##第五...

    leetcode下载-LearningNotess:学习笔记

    访问者模式 中介者模式 组合模式 装饰模式 享元模式 桥接模式 ##第二部分 ##第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 ##第四部分 ##第五...

    leetcode下载-StudyNotes:学习笔记

    访问者模式 中介者模式 组合模式 装饰模式 享元模式 桥接模式 ##第二部分 ##第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 ##第四部分 ##第五...

    leetcode下载-LearningNotes-master:学习笔记

    访问者模式 中介者模式 组合模式 装饰模式 享元模式 桥接模式 ##第二部分 ##第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 ##第四部分 ##第五...

Global site tag (gtag.js) - Google Analytics