java设计模式---访问者模式
Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自
己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广
泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Visitor(访问者)模
式是比较常用的一个模式.
应用场景:对于某对象结构中各元素的操作。如果需要在不修改各元素类的前提
下定义作用于这些元素的新操作,也就是动态的增加新的方法应该考虑访问者模式。
想让数个不同的访问者对同一个对象集合进行访问时,Visitor模式可以发挥它
的强大作用。Visitor先调用了Visitable类中的方法,这个方法又回调到Visitor类中
在此写了7个java类来描述说明Visitor设计模式;
1、 NodeA.java 可访问节点A
2、 NodeB.java 可访问节点B
3、 NodeC.java 可访问节点C
4、 Visitable.java 可访问对象接口
5、 Visitor.java 访问者接口
6、 VisitorA.java 访问者A
7、 VisitorTest.java 带有main方法的测试类
=============== 1、 NodeA.java package visitor; public class NodeA implements Visitable { public void accept(Visitor visitor) { visitor.visit(this); } } =============== 1 end =============== 2、 NodeB.java package visitor; public class NodeB implements Visitable { public void accept(Visitor visitor) { visitor.visit(this); } } =============== 2 end =============== 3、 NodeC.java package visitor; public class NodeC implements Visitable { public void accept(Visitor visitor) { visitor.visit(this); } } =============== 3 end =============== 4、 Visitable.java package visitor; public interface Visitable { public void accept(Visitor visitor); } =============== 4 end =============== 5、 Visitor.java package visitor; import java.util.Collection; public interface Visitor { //访问节点A public void visit(NodeA nodeA); //访问节点B public void visit(NodeB nodeB); //访问节点C public void visit(NodeC nodeC); //访问节点集合 public void visitCollection(Collection collection); } =============== 5 end =============== 6、 VisitorA.java package visitor; import java.util.Collection; import java.util.Iterator; public class VisitorA implements Visitor { public void visit(NodeA a){ System.out.println("Execute visitNodeA method!");; } public void visit(NodeB b){ System.out.println("Execute visitNodeB method!");; } public void visit(NodeC c){ System.out.println("Execute visitNodeC method!");; } public void visitCollection(Collection collection){ Iterator iterator = collection.iterator(); while (iterator.hasNext()) { Object o = iterator.next(); if (o instanceof Visitable) ((Visitable)o).accept(this); } } } =============== 6 end =============== 7、 VisitorTest.java package visitor; import java.util.ArrayList; import java.util.List; public class VisitorTest { public static void main(String[] args) { NodeA nodeA = new NodeA(); NodeB nodeB = new NodeB(); NodeC nodeC = new NodeC(); VisitorTest nodeD = new VisitorTest(); //访问单个对象 VisitorA visitorA = new VisitorA(); visitorA.visit(nodeA); visitorA.visit(nodeB); visitorA.visit(nodeC); //访问集合 List<Visitable> list = new ArrayList<Visitable>(); list.add(nodeA); list.add(nodeB); list.add(nodeC); visitorA.visitCollection(list); } } =============== 7 end
在两个接口Visitor和Visitable中,确保Visitable很少变化,也就是说,确保不能
老有新的Element元素类型加进来,可以变化的是访问者行为或操作,也就是
Visitor的不同子类可以有多种,这样使用访问者模式最方便.
java设计模式---访问者模式的更多相关文章
- JAVA 设计模式 访问者模式
用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途
- Java设计模式—访问者模式
原文地址:http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html 总结的太棒啦,导致自己看了都不想总结了...... 在 ...
- Java设计模式-访问者模式(Visitor)
访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定算法又易变化的系统.因为访问者模式使得算法操作增加变得容易.若系统数据结构对象易于变化,经 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- java设计模式--单列模式
java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...
- 3.java设计模式-建造者模式
Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- Java设计模式——外观模式
JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构
随机推荐
- python2.7入门---条件语句
前段时间呢,把MongoDB的基础内容了解的差不多了.接下来,就开始学习python2.7的基础内容喽.接着前面的知识点来学习.首先,来看一下条件语句.Python条件语句是通过一条或多条语句 ...
- 基于GCC的openMP学习与测试
(一).openMP简述 Open Multiprocessing (OpenMP) 框架是一种功能极为强大的规范,可以帮助您利用 C.C++ 和 Fortran 应用程序中的多个核心带来的好处,是基 ...
- 腾讯北京SNG一面
写在前面 面试官超nice,以一种聊天的形式跟你交流.上午10点10左右开始,11点40结束.总的来说,基础还可以,但是有些东西的底层学的还是不够深. 问题回忆 自我介绍 怎么平衡科研与项目开发之间的 ...
- 性能优化之mysql优化——慢查日志的开启方式和存储
-- MySQL优化 -- mysql 慢查日志的开启方式和存储 -- 1) 查看mysql是否开启慢查询日志 SHOW VARIABLES LIKE 'slow_query_log'; -- 2) ...
- Tomcat关闭日志输出
tomcat中禁用catalina.out的输出,又可能很大. 1.直接修改catalina.sh文件的输出语句. 在文件中找到以下内容. if [ -z "$CATALINA_OUT&qu ...
- Docker学习系列(二)Docker初体验
一.系统要求 Docker的安装,需要在CentOS 7.0+版本,内核至少3.10,64-bit uname --r [randy@randysun ~]$ uname --r -.el7.x86_ ...
- React-报错Warning:setState(...)on anunmounted component
一.原因 这种错误一般出现在react组件已经从DOM中移除.我们在react组件中发送一些异步请求的时候,就可能会出现这样的问题.举个例子,我们在componentWillMount中 ...
- Docker使用 Supervisor 来管理进程
Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务.但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个 ...
- 百度地图JS 搜索悬浮窗功能
这个需求的效果类似下面的截图,主要还是利用百度地图中自定义控件的功能,挺简单的.文档地址在这 http://lbsyun.baidu.com/index.php?title=jspopular 效果图 ...
- 前端CSS技术全解(一)
一.概述 1)用HTML完成样式工作 哪个标签有哪个属性难以记忆 需求变更影响较大(例如像修改成功法则以下的文字颜色需要修改4个地方) <h1 align="center"& ...