设计模式-访问者模式(主要理解“双重分派”)

发布时间 2023-12-10 21:25:05作者: 知识海洋中的浮萍

代码展示:

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