●首先提出一个功能实现,思考自己平时的代码怎么写
●然后用设计模式重构。寻找优缺点。
●反思这么写是不是多人配合更好了,扩展性强了,面向对象,体现解耦性............?
●反思该设计模式应用场景。使用范围。
-------------------------------------------------------------------------------------------------------------什么是访问者模式: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;
}
●2:现在实现打印获得指定目录的所有文件路径,
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());
}
}
那么访问者模式是如此方便的为我们遍历了元素的结构,这里我仿dom4j的访问者模式。
/**
* 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