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) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构
随机推荐
- PySC2是DeepMind的“星际争霸II学习环境”(SC2LE)的Python组件
PySC2是DeepMind的"星际争霸II学习环境"(SC2LE)的Python组件. 它暴露了暴雪娱乐公司的星际争霸II机器学习API作为Python RL环境. 这是Deep ...
- 配置文件错误导致jenkins无法启动 org.xmlpull.v1.XmlPullParserException: only 1.0 is supported as <?xml version not '1.1' (position: START_DOCUMENT seen <?xml version=\'1.1\'... @1:19)
org.xmlpull.v1.XmlPullParserException: only 1.0 is supported as <?xml version not '1.1' (position ...
- 开启CSP网页安全政策防止XSS攻击
一.简介 CSP是网页安全政策(Content Security Policy)的缩写.是一种由开发者定义的安全性政策申明,通过CSP所约束的责任指定可信的内容来源,(内容可以是指脚本.图片.sty ...
- 基于PHP的地址智能解析案例-快宝开放平台
快宝地址智能解析,批量录入收件人.发件人最好的解决方案,广泛应用于快递行业,电商行业,ERP应用等. 一.对接前准备 注册快宝开放平台,获得开发者账号,查看如何注册. 二.对接联调 快宝开放平台支持多 ...
- React-报错Warning:setState(...)on anunmounted component
一.原因 这种错误一般出现在react组件已经从DOM中移除.我们在react组件中发送一些异步请求的时候,就可能会出现这样的问题.举个例子,我们在componentWillMount中 ...
- python学习之路基础篇(第七篇)
一.模块 configparser configparser用于处理特定格式的文件,其本质是利用open来对文件进行操作 [section1] # 节点 k1 = v1 # 值 k2:v2 # 值 [ ...
- Go 语言常量
常量是一个简单值的标识符,在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifier [type] ...
- [Matlab+C/C++] 读写二进制文件
introduction 因为Matlab操作简单.方便,它被应用于很多领域:音频处理,图像处理,数值计算等.尽管MATLAB容易操作,但受限于他的语言解释机制,MATLAB的执行速度通常较低.C/C ...
- 集群技术(二) MySQL集群简介与配置详解
when?why? 用MySQL集群? 减少数据中心结点压力和大数据量处理(读写分离),采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据 ...
- Cassandra Secondary Index 介绍
摘要 本文主要介绍cassandra中的索引,物化视图,有些知识点需要对cassandra有基本的认识才能理解.比如数据在cassandra节点中如何分布.如果有不明白的地方可以看本专栏之前文章.或者 ...