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) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构
随机推荐
- Spring中整合Cage,实现验证码功能
1.pom.xml中添加Cage依赖. <dependency> <groupId>com.github.cage</groupId> <artifactId ...
- Java正则过滤
import java.util.regex.Matcher; import java.util.regex.Pattern; public class LongStringtonumber { pu ...
- Nginx+Tomca+Redis实现负载均衡、资源分离、session共享
目标实现:Nginx作为负载均衡后端多Tomcat实例,通过Redis实现Session共享. 操作系统环境:CentOS 6.8 SSH:SecureCRT 其中 Nginx服务:80端口 Tomc ...
- 找到一个牛的一逼的,超简易ssm和ssh的学习网址
http://how2j.cn 蛋疼的是,我早就用springboot了!不过,可以给公司新人看.
- 转:函数signal()
from:http://blog.sina.com.cn/s/blog_4b226b92010119l5.html 当服务器close一个连接时,若client端接着发数据.根据TCP协议的规定,会收 ...
- JS判断PC还是移动端打开网页
最近在做移动端网站,也需兼容PC端.还没找到更好的方法,只能用javascr判断用户是在PC端打开还是移动端打开. JS判断 var isPC = function (){ var userAg ...
- Node.js 常用工具util
util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherits(constructor ...
- U盘PE无人值守安装centOS6
一.制作 1.需要用到的工具:老毛桃PX工具.系统ISO.一个8GU盘 老毛桃PE工具 http://laomaotao.net/ CentOS启动映像 http://mirrors.163.com/ ...
- Java内存泄漏分析系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用
原文地址:http://www.javatang.com JVM Heap Dump(堆转储文件)的生成 正如Thread Dump文件记录了当时JVM中线程运行的情况一样,Heap Dump记录了J ...
- Linux 虚存的性能问题
虚存子系统是所有 UNIX 系统的核心组件.下面讨论虚存系统的实现及其对操作系统中几乎其他所有子系统的作用和影响.首先详细说明一些基本的内存管理问题:然后具体分析 Linux 操作系统如何实施虚存管理 ...