设计模式之访问者模式

main
===================================================================================
package com.visitor.sym;

public class TestVisitor {

	/**
	 * @param args
	 * 抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。
	 * 访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。
	 * 抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。
	 * 元素类:实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式了。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		VisitorI visitor = new Visitor();
		ConcreteElement1 concreteElement1 = new ConcreteElement1();
		concreteElement1.accept(visitor);
		ConcreteElement2 concreteElement2 = new ConcreteElement2();
		concreteElement2.accept(visitor);
	}

}
访问者接口
================================================================================
package com.visitor.sym;

public interface VisitorI {
	void visit(ConcreteElement1 concreteElement1);

	void visit(ConcreteElement2 concreteElement2);
}
具体访问者
================================================================================
package com.visitor.sym;

public class Visitor implements VisitorI {

	@Override
	public void visit(ConcreteElement1 concreteElement1) {
		// TODO Auto-generated method stub
		concreteElement1.doSomething();
	}

	@Override
	public void visit(ConcreteElement2 concreteElement2) {
		// TODO Auto-generated method stub
		concreteElement2.doSomething();
	}

}
元素接口
=================================================================================
package com.visitor.sym;

public interface Element {
	void accept(VisitorI visitor);

	void doSomething();
}
元素一:
=================================================================================
package com.visitor.sym;

public class ConcreteElement1 implements Element {

	@Override
	public void accept(VisitorI visitor) {
		// TODO Auto-generated method stub
		visitor.visit(this);
	}

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("这是第一个元素");
	}

}
元素二:
================================================================================
package com.visitor.sym;

public class ConcreteElement2 implements Element {

	@Override
	public void accept(VisitorI visitor) {
		// TODO Auto-generated method stub
		visitor.visit(this);
	}

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("这是第二个元素");
	}

}
/*打印结果:这是第一个元素
这是第二个元素*/

你可能感兴趣的:(访问者模式)