java 23种设计模式之行为型模式—访问者模式(21)

java 23种设计模式之行为型模式—访问者模式(21)

访问者模式:如果一个系统有比较完整的结构,其算法又易于变化,那么我们就可以使用访问者模式

访问者模式通常有以下几个角色

访问者角色(Visitor): 该接口定义了访问者可以访问那些元素
具体访问者角色(Concrete Visitor): 实现每个访问者角色.
元素角色(Element): 定义了当前这个元素被那一类访问者访问,方法就是定义一个Accept操作,以一个访问者为参数
具体元素角色(Concrete Element): 实现由元素角色的Accept操作.
对象结构角色(Object Structure): 使用访问者模式必备的角色. 它有以下特征: 1、枚举它的元素; 2、可以提供一个高层的接口以允许该访问者访问它的元素; 3、可以是一个复合(组合模式)或是一个集合,。


有人说访问者模式是行为型模式中最难理解的,其实不难的。

本例以面试官和应聘者为例

面试官就是元素角色

而应聘者就是访问者角色


应聘者 —— 访问者角色


/*
 * 本例模拟面试,一共有两位面试官面试两位应聘者
 * 本例 应聘者就是访问者
 */
public interface Applicant {
	//两位应聘者需要面试两位面试官Interviewer1(初试)和Interviewer2(复试)
	
	public void visitor(Interviewer1 interviewer1);
	public void visitor(Interviewer2 interviewer2);
}

面试官 —— 元素角色


/*
 * 定义面试官需要面试的是那一类访问者
 */
public interface Interviewer {
	public void Interview(Applicant applicant);
}


具体的应聘者1 —— 具体应聘者角色1


/*
 * 定义应聘者可以访问的面试官
 */
public class Applicant1 implements Applicant{

	@Override
	public void visitor(Interviewer1 interviewer1) {
		System.out.println(this.getClass().getSimpleName() + " 访问 " + interviewer1.getClass().getSimpleName());
		
	}

	@Override
	public void visitor(Interviewer2 interviewer2) {
		System.out.println(this.getClass().getSimpleName() + " 访问 " + interviewer2.getClass().getSimpleName());
		
	}

}
具体的应聘者2 —— 具体应聘者角色2



/*
 * 定义应聘者可以访问的面试官
 */
public class Applicant2 implements Applicant{

	@Override
	public void visitor(Interviewer1 interviewer1) {
		System.out.println(this.getClass().getSimpleName() + " 访问 " + interviewer1.getClass().getSimpleName());
		
	}

	@Override
	public void visitor(Interviewer2 interviewer2) {
		System.out.println(this.getClass().getSimpleName() + " 访问 " + interviewer2.getClass().getSimpleName());
		
	}

}
具体面试官1 —— 具体元素1



//面试官一
public class Interviewer1 implements Interviewer{

	@Override
	public void Interview(Applicant applicant) {
		//访问面试官1
		//这里面有一些逻辑方法可以单独展示给应聘者
		applicant.visitor(this);
		
	}

}

具体面试官2 —— 具体元素2

//面试官一
public class Interviewer2 implements Interviewer{

	@Override
	public void Interview(Applicant applicant) {
		//访问面试官2
		//这里面有一些逻辑方法可以单独展示给应聘者
		applicant.visitor(this);
		
	}

}

对象结构角色


/*
 * 对象结构劫色
 * 他可以管理应聘者可以访问的面试官,如增加删除,还可以显示所有的访问面试官元素
 */
public class ObjectApplicant {
	private final List<Interviewer> interviewer = new ArrayList<Interviewer>();

	public void addElement(Interviewer I) {
		interviewer.add(I);
	}

	public void removeElement(Interviewer I) {
		interviewer.remove(I);
	}

	public void accept(Applicant applicant) {
		for (Interviewer i : interviewer) {
			i.Interview(applicant);
		}
	}
}


测试类


public class Client {

	public static void main(String[] args) {
		ObjectApplicant oa = new ObjectApplicant();
		oa.addElement(new Interviewer1());
		oa.addElement(new Interviewer2());
		
		Applicant1 applicant1 = new Applicant1();
		Applicant2 applicant2 = new Applicant2();

		oa.accept(applicant1);
		oa.accept(applicant2);

	}

}
结果如下:


Applicant1 访问 Interviewer1
Applicant1 访问 Interviewer2
Applicant2 访问 Interviewer1
Applicant2 访问 Interviewer2




爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img