JAVA访问者模式.docx
- 文档编号:10187921
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:7
- 大小:16.21KB
JAVA访问者模式.docx
《JAVA访问者模式.docx》由会员分享,可在线阅读,更多相关《JAVA访问者模式.docx(7页珍藏版)》请在冰豆网上搜索。
JAVA访问者模式
访问者模式(Visitor)
Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Visitor(访问者)模式是比较常用的一个模式.
应用场景:
对于某对象结构中各元素的操作。
如果需要在不修改各元素类的前提下定义作用于这些元素的新操作,也就是动态的增加新的方法应该考虑访问者模式。
想让数个不同的访问者对同一个对象集合进行访问时,Visitor模式可以发挥它的强大作用。
Visitor先调用了Visitable类中的方法,这个方法又回调到Visitor类中
在此写了10个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方法的测试类
5变体、Visitor.java访问者接口(应用java反射机制)
6变体、VisitorA.java访问者A(应用java反射机制)
7变体、VisitorTest.java带有main方法的测试类(应用java反射机制)
===============1、NodeA.java
packagevisitor;
publicclassNodeAimplementsVisitable{
publicvoidaccept(Visitorvisitor){
visitor.visit(this);
}
}
===============1end
===============2、NodeB.java
packagevisitor;
publicclassNodeBimplementsVisitable{
publicvoidaccept(Visitorvisitor){
visitor.visit(this);
}
}
===============2end
===============3、NodeC.java
packagevisitor;
publicclassNodeCimplementsVisitable{
publicvoidaccept(Visitorvisitor){
visitor.visit(this);
}
}
===============3end
===============4、Visitable.java
packagevisitor;
publicinterfaceVisitable{
publicvoidaccept(Visitorvisitor);
}
===============4end
===============5、Visitor.java
packagevisitor;
importjava.util.Collection;
publicinterfaceVisitor{
//访问节点A
publicvoidvisit(NodeAnodeA);
//访问节点B
publicvoidvisit(NodeBnodeB);
//访问节点C
publicvoidvisit(NodeCnodeC);
//访问节点集合
publicvoidvisitCollection(Collectioncollection);
}
===============5end
===============6、VisitorA.java
packagevisitor;
importjava.util.Collection;
importjava.util.Iterator;
publicclassVisitorAimplementsVisitor{
publicvoidvisit(NodeAa){
System.out.println("ExecutevisitNodeAmethod!
");;
}
publicvoidvisit(NodeBb){
System.out.println("ExecutevisitNodeBmethod!
");;
}
publicvoidvisit(NodeCc){
System.out.println("ExecutevisitNodeCmethod!
");;
}
publicvoidvisitCollection(Collectioncollection){
Iteratoriterator=collection.iterator();
while(iterator.hasNext()){
Objecto=iterator.next();
if(oinstanceofVisitable)
((Visitable)o).accept(this);
}
}
}
===============6end
===============7、VisitorTest.java
packagevisitor;
importjava.util.ArrayList;
importjava.util.List;
publicclassVisitorTest{
publicstaticvoidmain(String[]args){
NodeAnodeA=newNodeA();
NodeBnodeB=newNodeB();
NodeCnodeC=newNodeC();
VisitorTestnodeD=newVisitorTest();
//访问单个对象
VisitorAvisitorA=newVisitorA();
visitorA.visit(nodeA);
visitorA.visit(nodeB);
visitorA.visit(nodeC);
//访问集合
List
list.add(nodeA);
list.add(nodeB);
list.add(nodeC);
visitorA.visitCollection(list);
}
}
===============7end
在两个接口Visitor和Visitable中,确保Visitable很少变化,也就是说,确保不能老有新的Element元素类型加进来,可以变化的是访问者行为或操作,也就是Visitor的不同子类可以有多种,这样使用访问者模式最方便.
当然采用java反射机制,可以使对象集合中的对象经常有变化。
采用java反射机制的Visitor变体
采用了java反射机制的vistor变体,类1,2,3,4均不变
通过使用JavaReflection,可以增强Visitor模式,使之具有操作对象结构的强大功能,并在增加新Visitable类型方面提供灵活性。
===============5变体、Visitor.java
packagevisitor;
publicinterfaceVisitor{
//访问者触发的方法
publicvoidvisit(Objecto);
}
===============5变体end
===============6变体、VisitorA.java
packagevisitor;
importjava.lang.reflect.Method;
importjava.util.AbstractCollection;
importjava.util.Iterator;
publicclassVisitorAimplementsVisitor{
publicvoidvisitObject(Objecto){
System.out.println("ExecutevisitObjectmethod!
");;
}
publicvoidvisitNodeA(NodeAa){
System.out.println("ExecutevisitNodeAmethod!
");;
}
publicvoidvisitNodeB(NodeBb){
System.out.println("ExecutevisitNodeBmethod!
");;
}
publicvoidvisitNodeC(NodeCc){
System.out.println("ExecutevisitNodeCmethod!
");;
}
publicvoidvisitAbstractCollection(AbstractCollection
Iterator
while(iterator.hasNext()){
iterator.next().accept(this);
}
}
//对o元素进行访问
publicvoidvisit(Objecto){
try{
//1Getthemethodofvisitorneededtocall
Methodm=getMethod(o.getClass());
//2executethemethod
m.invoke(this,newObject[]{o});
}catch(Exceptione){
//TODO:
handleexception
e.printStackTrace();
}
}
//根据传进来的类名获得访问者需要执行的方法
protectedMethodgetMethod(Classc){
Classnewc=c;
Methodm=null;
//根据传进来的类名去寻找相应的方法,如果不从在就去超类中找
Stringmethod=null;
while(m==null&&newc!
=Object.class){
method="visit"+newc.getSimpleName();
try{
m=getClass().getMethod(method,newClass[]{newc});
}catch(NoSuchMethodExceptione){
newc=newc.getSuperclass();
}
}
//如果超类是Object,则到接口中找
if(newc==Object.class){
Class[]interfaces=c.getInterfaces();
for(inti=0;i method="visit"+interfaces[i].getSimpleName(); try{ m=getClass().getMethod(method,newClass[]{interfaces[i]}); }catch(NoSuchMethodExceptione){} } } //如果m==null,则执行visitor中默认的方法 if(m==null){ try{ m=this.getClass().getMethod("visitObject",newClass[]{Object.class}); }catch(Exceptione){} } returnm; } } ===============6变体end ===============7变体、VisitorTest.java packagevisitor; importjava.util.ArrayList; importjava.util.List; publicclassVisitorTest{ publicstaticvoidmain(String[]args){ NodeAnodeA=newNodeA(); NodeBnodeB=newNodeB(); NodeCnodeC=newNodeC(); VisitorTestnodeD=newVisitorTest(); //访问单个对象 VisitorAvisitorA=newVisitorA(); visitorA.visit(nodeA); visitorA.visit(nodeB); visitorA.visit(nodeC); visitorA.visit(nodeD); //访问集合 List list.add(nodeA); list.add(nodeB); list.add(nodeC); visitorA.visit(list); } } ===============7变体end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 访问者 模式