设计模式(JAVA)------访问者模式

本文介绍访问者模式在员工信息汇报场景的应用,展示了如何通过访问者模式实现不同类型的员工信息展示,包括普通员工的工作职责和管理层的业绩表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:将公司中所有人员信息都打印汇报出来,其中假设公司有两类人员:

1.普通员工

2.管理层

不同人员类型的信息是不同的。


访问者模式:

定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

包含如下几个角色:

1.Visitor-抽象访问者

抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象是可以被访问,利用了多态的性质

2.ConcreteVisitor-具体访问者

它影响访问者访问到一个类后该怎么干,要做什么事。

3.Element-抽象元素

接口或者抽象类,声明接受哪一类访问者访问,程序上市通过accept方法中的参数来定义的

4.ConcreteElement-具体元素

实现accept方法,通常是Visitor.visit(this)。

5.ObjectStruture-结构对象

元素产生者,一般在多个不同类中。


场景问题解决类图:


主要涉及如下几个角色:

1.抽象员工

2.普通员工

3.管理阶层

4.访问者接口

5.访问者实现

6.场景类


代码实现:

Employee:

public abstract class Employee {
	
	public final static int MALE = 0;
	public final static int FEMALE = 1;
	
	private String name;
	private int salary;
	private String sex;
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String string) {
		this.sex = string;
	}
	
	public abstract void accept(IVisitor visitor);
	
	

}


CommonEmployee:

	
	private String job;

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}
	
	public void accept(IVisitor visitor) {
		visitor.visit(this);
	}

}


Manager:

public class Manager extends Employee {
	
	private String performance;

	public String getPerformance() {
		return performance;
	}

	public void setPerformance(String performance) {
		this.performance = performance;
	}
	
	public void accept(IVisitor visitor) {
		visitor.visit(this);
	}

}


IVisitor:

public interface IVisitor {
	
	public void visit(CommonEmployee commonEmployee);
	public void visit(Manager manager);

}


Visitor:

public class Visitor implements IVisitor {

	public void visit(CommonEmployee commonEmployee) {
		System.out.println(this.getCommonEmployeeInfo(commonEmployee));
	}

	public void visit(Manager manager) {
		System.out.println(this.getManagerInfo(manager));
	}
	
	private String getBasicInfo(Employee employee) {
		String info = "姓名" + employee.getName() + "\t";
		info += "性别" + employee.getSex() + "\t";
		info += "薪水" + employee.getSalary() + "\t";
		return info;
	}
	
	private String getManagerInfo(Manager manager) {
		String basicInfo = this.getBasicInfo(manager);
		String otherInfo = "业绩" + manager.getPerformance() + "\t";
		return basicInfo + otherInfo;
	}
	
	private String getCommonEmployeeInfo(CommonEmployee commonEmployee) {
		String basicInfo = this.getBasicInfo(commonEmployee);
		String otherInfo = "工作" + commonEmployee.getJob() + "\t";
		return basicInfo + otherInfo;
	}

}


Client:

public class Client {
	
	public static void main(String[] agrs)throws Exception {
		
		for (Employee employee : mockEmployee()) {
			employee.accept(new Visitor());
		}
		
	}
	
	public static List<Employee> mockEmployee() {
		List<Employee> employeeList = new ArrayList<Employee>();
		CommonEmployee zc = new CommonEmployee();
		zc.setName("zc");
		zc.setSex(Sex.MAN.sex(Employee.MALE));
		zc.setSalary(14000);
		zc.setJob("程序员");
		employeeList.add(zc);
		
		Manager manager = new Manager();
		employeeList.add(manager);
		return employeeList;
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值