您的位置:首页 > 编程语言 > Java开发

Java Design Demo--访问者模式 (仿dom4J访问者模式demo)

2012-12-29 14:31 176 查看
●首先提出一个功能实现,思考自己平时的代码怎么写

●然后用设计模式重构。寻找优缺点。

●反思这么写是不是多人配合更好了,扩展性强了,面向对象,体现解耦性............?

●反思该设计模式应用场景。使用范围。
-------------------------------------------------------------------------------------------------------------
什么是访问者模式: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: