1.代码结构及UML

2.Manager

2.1 Manager
package Manager;

import Visitor.Visitor;

/** * @ClassName: Manager.Manager * @Description: Manager.Manager 定义一个accept操作 以访问者为参数 */
public abstract class Manager {
    /** * 用来接受添加功能 * * @param visitor */
    public abstract void accept(Visitor visitor);
}

2.2 DepartManager
package Manager;

import Visitor.Visitor;

/** * @ClassName: DepartManager * @Description: 部门管理员(DepartManager) */
public class DepartManager extends Manager {

    private String name;

    public DepartManager() {
    }

    public DepartManager(String name) {
        this.name = "部门管理员 " + name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.AddEmployee(this);
    }
}

2.3 CompanyManager
package Manager;

import Visitor.Visitor;

/** * @ClassName: CompanyManager * @Description: 公司管理员(CompanyManager) */
public class CompanyManager extends Manager {

    private String name;

    public CompanyManager() {
    }

    public CompanyManager(String name) {
        this.name = "公司管理员 " + name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.AddDepartment(this);
    }
}

3.Visitor

3.1 Visitor
package Visitor;

import Manager.CompanyManager;
import Manager.DepartManager;

/** * @ClassName: Visitor.Visitor * @Description: Visitor.Visitor 为Manager中的每一个具体实现类声明一个Visit操作 */
public abstract class Visitor {
    /** * 添加部门 * * @param companyManager */
    public abstract void AddDepartment(CompanyManager companyManager);

    /** * 添加雇员 * * @param departManager */
    public abstract void AddEmployee(DepartManager departManager);
}

3.2 CreateEmployee
package Visitor;

import Manager.CompanyManager;
import Manager.DepartManager;

/** * @ClassName: CreateEmployee * @Description: 创建员工的操作 */
public class CreateEmployee extends Visitor {
    /** * 添加部门 * * @param companyManager */
    @Override
    public void AddDepartment(CompanyManager companyManager) {
        System.out.println(companyManager.getName() + " 没有添加部门权限!");
    }

    /** * 添加雇员 * * @param departManager */
    @Override
    public void AddEmployee(DepartManager departManager) {
        System.out.println(departManager.getName() + " 添加雇员成功");
    }
}

3.3 CreateDepartment
package Visitor;

import Manager.CompanyManager;
import Manager.DepartManager;

/** * @ClassName: CreateDepartment * @Description: 创建部门的操作 */
public class CreateDepartment extends Visitor {
    /** * 添加部门 * * @param companyManager */
    @Override
    public void AddDepartment(CompanyManager companyManager) {
        System.out.println(companyManager.getName() + " 添加部门成功");
    }

    /** * 添加雇员 * * @param departManager */
    @Override
    public void AddEmployee(DepartManager departManager) {
        System.out.println(departManager.getName() + " 没有添加雇员权限!");
    }
}

4.ObjectStructure

import Manager.Manager;
import Visitor.Visitor;

import java.util.ArrayList;
import java.util.List;

/** * @ClassName: ObjectStructure * @Description: ObjectStructure提供一个高层的接口以允许访问者访问它的元素 */
public class ObjectStructure {
    private List<Manager> managers = new ArrayList<Manager>();

    public void add(Manager manager) {
        managers.add(manager);
    }

    public void remove(Manager manager) {
        managers.remove(manager);
    }

    public void accept(Visitor visitor) {
        for (Manager manager : managers) {
            manager.accept(visitor);
        }
    }
}

5.Test

import Manager.CompanyManager;
import Manager.DepartManager;
import Visitor.CreateDepartment;
import Visitor.CreateEmployee;
import Visitor.Visitor;

/** * @ClassName: Main * @Description: 测试类 */
public class Test{
    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.add(new CompanyManager("张三"));
        objectStructure.add(new DepartManager("李四"));

        Visitor visitor1 = new CreateDepartment();
        Visitor visitor2 = new CreateEmployee();

        objectStructure.accept(visitor1);
        objectStructure.accept(visitor2);
    }
}

6.运行截图