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

●首先提出一个功能实现,思考自己平时的代码怎么写

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

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

●反思该设计模式应用场景。使用范围。

-------------------------------------------------------------------------------------------------------------

什么是访问者模式: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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值