设计模式-访问者模式(主要理解“双重分派”)
代码展示:
package com.example.test;
import java.util.ArrayList;
import java.util.List;
public class 访问者模式 {
}
abstract class Department{
abstract void visit(FullTimeEmployee fullTimeEmployee);//正式工的访问
abstract void visit(PartTimeEmployee PartTimeEmployee);//临时工的访问
}
class FADepartment extends Department{//财务部
@Override
void visit(FullTimeEmployee fullTimeEmployee) {
//财务部实现对正式工的访问
System.out.println("财务部对 正式工 " + fullTimeEmployee.name +"进行了访问,已根据工作情况计算了薪水");
}
@Override
void visit(PartTimeEmployee PartTimeEmployee) {
//财务部实现对小时工的访问
System.out.println("财务部对 小时工 " + PartTimeEmployee.name +"进行了访问,已根据工作情况计算了薪水");
}
}
class HRDepartment extends Department{//人力资源部
@Override
void visit(FullTimeEmployee fullTimeEmployee) {
//人力资源部实现对正式工的访问
System.out.println("人力资源部对 正式工 " + fullTimeEmployee.name +"进行了访问,已汇总考勤情况");
}
@Override
void visit(PartTimeEmployee PartTimeEmployee) {
//人力资源部实现对小时工的访问
System.out.println("人力资源部对 小时工 " + PartTimeEmployee.name +"进行了访问,已汇总考勤情况");
}
}
interface Employee{//职员
void accept(Department department);
}
class FullTimeEmployee implements Employee{//正式工
public String name;//姓名
public double weeklyWage;//周薪
public int workTime;//工时
public void accept(Department department) {
department.visit(this);
}
}
class PartTimeEmployee implements Employee{//临时工
public String name;//姓名
public double hourWage;//时薪
public int workTime;//工时
public void accept(Department department) {
department.visit(this);
}
}
class EmployeeList{
private static final List<Employee> LIST = new ArrayList<>();
public void accept(Department department){
LIST.forEach(employee -> employee.accept(department));
}
}
访问者模式总结:
1.主要关注双重分派的含义,其实就是两次调用,
第一次是调用了元素的accept方法
在元素的accept方法内进行了第二次调用,调用了访问者的visit方法
最终在访问者的visit方法中完成了对元素的访问
2.可以很方便的增加一个访问者,但是增加一个元素就很麻烦。因为抽象访问者要增加新元素的访问方法,所有具体访问者都要重写新的访问方法,改动量很大
所以对于访问者的改动是满足开闭原则的,但是针对元素就不满足开闭原则。此模式对于开闭原则具有倾斜性
优缺点总结:TODO
适用场景:TODO
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端