23种设计模式+额外常用设计模式汇总 (持续更新)

访问者模式

访问者( Visitor )模式的定义: 将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作, 为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。

优点:

①扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。
②复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。
③灵活性好。访问者模式将数据结构与作用于结构上的操作解嘱, 使得操作集合可相对自由地
演化而不影响系统的数据结构。
④符合单一职责原则。访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问
者的功能都比较单一。

缺点:

①增加新的元素类很困难。在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作, 这违背了“开闭原则” 。
②破坏封装。访问者模式中具体元素对访问者公布细节, 这破坏了对象的封装性。
③违反了依赖倒置原则。访问者模式依赖了具体类,而没有依赖抽象类。

使用场景: 1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。

应用场景

对象结构相对稳定,但其操作算法经常变化的程序。
对象结构中的对象需要提供多种不同且不相关的操作,而且要避免让这些操作的变化影响对象的结构。
对象结构包含很多类型的对象,希望对这些对象实施一些依赖于其具体类型的操作。

实现

模式的结构
访问者模式包含以下主要角色。
( 1 )抽象访问者( Visitor )角色: 定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作visitXXX() ,该操作中的参数类型标识了被访问的具体元素。
( 2 ) 具体访问者( Concrete Visitor )角色: 实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么。
( 3 )抽象元素( Element )角色: 声明一个包含接受操作accept()的接口,被接受的访问者对象作为accept()方法的参数。
( 4 )具体元素( Concrete Element )角色:实现抽象元素角色提供的accept()操作,其方法体通常都是visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作。
( 5 )对象结构(Object Structure ) 角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,通常由List、Set、Map 等聚合类实现。
UML:

//VisitorTest.java
package Visitor;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;interface Visitor {void visit(ConcreteElementA element);void visit(ConcreteElementB element);
}//抽象访问者//具体访问者A类
class ConcreteVisitorA implements Visitor {public void visit(ConcreteElementA element) {System.out.println("具体访问者A访问-->" + element.operationA());}public void visit(ConcreteElementB element) {System.out.println("具体访问者A访问-->" + element.operationB());}
}//具体访问者B类
class ConcreteVisitorB implements Visitor {public void visit(ConcreteElementA element) {System.out.println("具体访问者B访问-->" + element.operationA());}public void visit(ConcreteElementB element) {System.out.println("具体访问者B访问-->" + element.operationB());}
}//抽象元素类
interface Element {void accept(Visitor visitor);
}//具体元素A类
class ConcreteElementA implements Element {public void accept(Visitor visitor) {visitor.visit(this);}public String operationA() {return "具体元素A的操作。";}
}//具体元素B类
class ConcreteElementB implements Element {public void accept(Visitor visitor) {visitor.visit(this);}public String operationB() {return "具体元素B的操作。";}
}
//对象结构角色
class ObjectStructure {private List<Element> list = new ArrayList<Element>();public void accept(Visitor visitor) {Iterator<Element> i = list.iterator();while (i.hasNext()) {((Element) i.next()).accept(visitor);}}public void add(Element element) {list.add(element);}public void remove(Element element) {list.remove(element);}
}public class VisitorTest {public static void main(String[] args) {ObjectStructure os = new ObjectStructure();os.add(new ConcreteElementA());os.add(new ConcreteElementB());Visitor visitor = new ConcreteVisitorA();os.accept(visitor);System.out.println("------------------------");visitor = new ConcreteVisitorB();os.accept(visitor);}
}

我们再举一个客户管理系统的例子
用户位个人用户,企业用户
提出服务申请、客户价值分析、客户对产品偏好

package CRM;public interface Customer {public void accpet(Visitor vis);}package CRM;public class Enterprise implements Customer {@Overridepublic void accpet(Visitor vis) {// TODO Auto-generated method stubvis.visit(this);}public String oper(){return "企业用户";}}package CRM;public class Personal implements Customer {@Overridepublic void accpet(Visitor vis) {// TODO Auto-generated method stubvis.visit(this);}public String oper(){return "个人用户";}}package CRM;public interface Visitor {public void visit(Enterprise ent);public void visit(Personal per);}package CRM;public class Service_ApplyFor implements Visitor{@Overridepublic void visit(Enterprise ent) {// TODO Auto-generated method stubSystem.out.println(ent.oper()+"提出企业用户的服务申请");}@Overridepublic void visit(Personal per) {// TODO Auto-generated method stubSystem.out.println(per.oper()+"提出个人用户的服务申请");}}package CRM;public class Customer_AnalyzePrefer implements Visitor{@Overridepublic void visit(Enterprise ent) {// TODO Auto-generated method stubSystem.out.println("对"+ent.oper()+"提供企业用户的客户产品偏好分析");}@Overridepublic void visit(Personal per) {// TODO Auto-generated method stubSystem.out.println("对"+per.oper()+"提供个人用户的客户产品偏好分析");}}package CRM;public class Customer_AnalyzeValue implements Visitor{@Overridepublic void visit(Enterprise ent) {// TODO Auto-generated method stubSystem.out.println("对"+ent.oper()+"提供企业用户的客户价值分析");}@Overridepublic void visit(Personal per) {// TODO Auto-generated method stubSystem.out.println("对"+per.oper()+"提供个人用户的客户价值分析");}}package CRM;import java.util.ArrayList;import java.util.List;public class Manage_System {private List<Customer> OperList = new ArrayList<>();public void accept(Visitor vis) {for (Customer cus : OperList) {cus.accpet(vis);}}public void add(Customer cus){OperList.add(cus);}public void remove(Customer cus){OperList.remove(cus);}}package CRM;public class Client {public static void main(String[] args) {// TODO Auto-generated method stubManage_System MS = new Manage_System();MS.add(new Personal());MS.add(new Enterprise());Visitor vis=new Customer_AnalyzePrefer();MS.accept(vis);vis=new Customer_AnalyzeValue();MS.accept(vis);vis=new Service_ApplyFor();MS.accept(vis);}}

『设计模式』我能进来坐坐吗?--访问者模式相关推荐

  1. 『设计模式』JAVA I/O 与装饰者模式UML图

  2. 『设计模式』之小试牛刀

    为了更好的学习设计模式,以及督促自己完成设计模式的学习,现提笔为记. 怎么的,每周至少也要学一个设计模式!!! 恳请大家的监督和不吝赐教,共同学习和进步! 内容主要参考自<设计模式之禅>以 ...

  3. 『设计模式』HR:不会设计模式,你好意思来面试?(面试必备设计模式)

    23种设计模式+额外常用设计模式汇总 (持续更新) 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一 ...

  4. 『设计模式』不看就亏了的设计模式总结

    23种设计模式+额外常用设计模式汇总 (持续更新) 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一 ...

  5. 『设计模式』Web程序开发最基本的编程模式--MVC编程模式

    23种设计模式+额外常用设计模式汇总 (持续更新) 什么是MVC编程模式 ? MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controlle ...

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

    1.1概述 表示将一个作用于某对象结构中的各个元素的操作.它可以在不改变各个元素的类的前提下定义作用于这些元素的新操作.这就是访问者模式的定义. 编写类的时候,可能在该类中编写了若干个实例方法,该类的 ...

  7. 『设计模式』HR问了我朋友什么是简单工厂模式,竟被质疑是否学过设计模式,是否是计算机专业?

    23种设计模式+额外常用设计模式汇总 (持续更新)越是简单的东西,越是容易被忽略,我来带你们好复习一下! 简单工厂模式 简单工厂模式也被称为静态工厂模式;使用简单工厂模式可以将产品的"消费& ...

  8. 『设计模式』简单工厂模式

    23种设计模式+额外常用设计模式汇总 (持续更新) 简单工厂模式 简单工厂模式也被称为静态工厂模式;使用简单工厂模式可以将产品的"消费"和生产完全分开,客户端只需要知道自己需要什么 ...

  9. 『设计模式』小伙你的穿搭很潮!--装饰者模式

    23种设计模式+额外常用设计模式汇总 (持续更新) 装饰模式(Decorator):又名包装模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式常常被称为包裹模式,就 ...

最新文章

  1. 中小型商业银行的软件安全测试之道
  2. 在php中使用json
  3. 《C++PrimerPlus》阅读笔记 + 源码实践
  4. Product Overview page data loss handling
  5. 在.NET Core中使用Exceptionless分布式日志收集框架
  6. php 初始二维数组长度,php二维数组排序与默认自然排序的方法介绍
  7. 网页编程从入门到精通 杨凡_干货 | web前端入门基础知识
  8. Python应用实战-如何使用Plotly绘制精美图形?
  9. Python发送POST request payload形式的请求
  10. Ajax无刷新实现省市联动,并在回发后保留省市下拉框状态
  11. Python中默认参数self的理解
  12. mysql 查询时间戳(TIMESTAMP)转成常用可读时间格式
  13. 【开源】浏览器书签层级可视化
  14. python人名统计_「姓名分析」Python|美国婴儿姓名分析 - seo实验室
  15. 写一个PE的壳_Part 4:修复对ASLR支持+lief构建新PE
  16. Unity3d与iOS交互开发—接入平台SDK必备技能
  17. 计算机使用计数制是,进位计数制
  18. 2021年安全类比赛writeup总结
  19. shell脚本案例30个带详细解析
  20. matlab模拟分数布朗运动,分数布朗运动及其模拟FractionalBrownianMotion科研菜鸟http.PDF...

热门文章

  1. VC++编程实现多显示器控制(复制、横屏、纵屏,显示器个数)
  2. Android开发之原型图浏览器打开可点击跳转之Google插件之Axure(实际上大部分浏览器都可以安装这个插件)
  3. 2017年计算机基础知识答题宝典,2017年全国职称计算机考试答题技巧分享
  4. 我的世界网易怎么下载java材质包_我的世界中国版材质包怎么用 材质包设置
  5. oracle mysql 创建表,Oracle 创建表用户、空间
  6. mac地址容量的作用_S6520X+MAC地址容量检查命令
  7. URAL 题目1297. Palindrome(后缀数组+RMQ求最长回文子串)
  8. JavaScript模仿块级作用域
  9. Unit testing Cmockery 简单使用
  10. [数据结构]合并有序数组