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/天,具体规则查看活动详情