●首先提出一个功能实现,思考自己平时的代码怎么写
●然后用设计模式重构。寻找优缺点。
●反思这么写是不是多人配合更好了,扩展性强了,面向对象,体现解耦性............?
●反思该设计模式应用场景。使用范围。
-------------------------------------------------------------------------------------------------------------什么是访问者模式:http://baike.baidu.com/view/3599899.htm
本文代码下载:http://download.csdn.net/detail/b275518834/4941382
●精髓:访问结构对象的各个元素功能与逻辑操作分离
在Java中FileFilter接口就是访问者模式例子。
●需要你实现的功能1:打印获得指定目录的所有文件数量(不含文件夹)(但包括子文件夹下的所有文件)。
public static void main(String[] args) { System.out.println(rootFile(new File("F:/Program Files (x86)"),0)); } public static int rootFile(File fileRoot,int i) { for(File file:fileRoot.listFiles()) { if(file.isDirectory()) { i=rootFile(file,i); } else { i++; } } return i; }
public static void main(String[] args) { System.out.println(rootFile(new File("F:/Program Files (x86)"),0)); System.out.println(rootFile2(new File("F:/Program Files (x86)"),new ArrayList())); } public static List rootFile2(File fileRoot,List list) { for(File file:fileRoot.listFiles()) { if(file.isDirectory()) { list=rootFile2(file,list); } else { list.add(file); } } return list; } public static int rootFile(File fileRoot,int i)
假如以后你想获得文件夹下所有图片格式文件数量的路径.........
你会总是复制这段代码然后修改为自己想要的那种功能。
也许你会想到为什么我不先拿到所有文件的集合 再去遍历呢?
这样做相当于遍历了两遍,就会降低性能。
●试试用设计模式改造一下
public static void main(String[] args) { FileUtils.accept(new File("Z:\\Program Files (x86)"), new Visitor() { int i = 0; @Override public void visit(File f) { // TODO Auto-generated method stub if (!f.isDirectory()) { System.out.println(++i); } } }); }
import java.io.File; public class FileUtils { public interface Visitor { public void visit(File f); } public static void accept(File fileRoot,Visitor vis) { for(File file:fileRoot.listFiles()) { vis.visit(file); if(file.isDirectory()) { accept(file,vis); } } }
●以后有什么新需求只需要编写逻辑的部分了,如打印所有图片格式的文件
public static void main(String[] args) { FileUtils.accept(new File("Z:\\新建文件夹"), new FileUtils.Visitor() { @Override public void visit(File f) { // TODO Auto-generated method stub try { String str; if ((str = ImageUtils.getFormatInFile(f)) != null) { System.out.println(f.getPath() + "是图片文件"); System.out.println(str); } } catch (Exception e) { // TODO Auto-generated catch block } } }); }
●再此请回顾访问者模式的概念。xml中dom4J解析也用到了访问者模式你只需要用几行代码就可以遍历所有元素
/** * xml的访问者模式 * */ public class Main_VisitorDemo1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // Element root = ElementFactory.decodeRootResource("/root/dowork/api.xml"); root.accept(new MyVisitor()); } } class MyVisitor extends VisitorSupport { public void visit(Element element) { System.out.println(element.getName()); } public void visit(Attribute attr) { System.out.println(attr.getName()); } }
/** * xml的访问者模式代码示例 * */ public class Main_VisitorDemo2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Element root = ElementFactory .decodeRootResource("/root/dowork/api.xml"); println(root, new VisitorSupport() { public void visit(Element element) { System.err.println(element.getName()); } public void visit(Attribute attr) { System.out.print(attr.getName() + "=" + attr.getValue() + " "); } }); } /** * 打印所有节点的值和属性 * */ public static void println(Element root, org.dom4j.Visitor v) { v.visit(root); printAttribute(root, v); List<Element> childNodes = root.elements(); for (Element e : childNodes) { printAttribute(e, v); println(e, v); } } public static void printAttribute(Element e, org.dom4j.Visitor v) { List<Attribute> attrs = e.attributes(); if (attrs != null && attrs.size() > 0) { for (Attribute attr : attrs) { v.visit(attr); } } } }
至此请回顾访问者模式的概念,优缺点。
本文代码下载:http://download.csdn.net/detail/b275518834/4941382