设计模式之访问者模式

来源:互联网 发布:淘宝抢购软件 编辑:程序博客网 时间:2024/06/08 01:00
public abstract class Emp {
    protected String no;
    protected String name;
    protected String position;
    protected float salary;
    
    private int length = 0;
    
    public Emp(String no, String name, String position, float salary) {
        this.no = no;
        this.name = name;
        this.position = position;
        this.salary = salary;
        
        this.length += (null==no || "".equals(no.trim()))?0:no.getBytes().length;
        this.length += (null==name || "".equals(name.trim()))?0:name.getBytes().length;
        this.length += (null==position || "".equals(position.trim()))?0:position.getBytes().length;
        this.length += String.valueOf(salary).getBytes().length;
    }
    public void printBaseInfo(){
        System.out.println("-|"+no+"  "+name+"  "+position+"  "+salary);
    }
    
    public abstract void addEmp(Emp emp);
    public abstract Emp removeEmp(String no);
    public abstract void printEmpsInfo(int layer);
    
    public abstract void acceptVisitor(IVisitor visitor);
    
    protected void printChar(int layer){
        for (int i = 0; i <layer*2; i++) {
            System.out.print("-");
        }
    }
    protected void printLine(){
        System.out.println("+");
        for (int i = 0; i <length+4; i++) {
            System.out.print("-");
        }
        System.out.println("-");
    }
    
    public String getNo() {
        return no;
    }
    public void setNo(String no) {
        this.no = no;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPosition() {
        return position;
    }
    public void setPosition(String position) {
        this.position = position;
    }
    public float getSalary() {
        return salary;
    }
    public void setSalary(float salary) {
        this.salary = salary;
    }
}


public class Emploee extends Emp {

    public Emploee(String no, String name, String position, float salary) {
        super(no, name, position, salary);
    }

    @Override
    public void addEmp(Emp emp) {
        return;
    }

    @Override
    public void printEmpsInfo(int layer) {
        return;
    }

    @Override
    public Emp removeEmp(String no) {
        return null;
    }

    @Override
    public void acceptVisitor(IVisitor visitor) {
        visitor.visit(this);
    }

}

public class Manager extends Emp {

    private List<Emp> list = new ArrayList<Emp>();
    public Manager(String no, String name, String position, float salary) {
        super(no, name, position, salary);
    }

    @Override
    public void addEmp(Emp emp) {
        list.add(emp);
    }

    @Override
    public void printEmpsInfo(int layer) {
        int tem = ++layer;
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i)==null){
                continue;
            }
            printChar(tem);
            list.get(i).printBaseInfo();
            list.get(i).printEmpsInfo(tem);
        }
    }

    @Override
    public Emp removeEmp(String no) {
        Emp emp = null;
        if(no!=null && "".equals(no.trim())){
            for (int i = 0; i < list.size(); i++) {
                if(list.get(i)==null){
                    continue;
                }
                if(no.equals(list.get(i).getNo())){
                    emp = list.remove(i);
                    break;
                }
            }
        }
        return emp;
    }

    @Override
    public void acceptVisitor(IVisitor visitor) {
        visitor.visit(this);
        for (int i = 0; i < this.list.size(); i++) {
            if(null == this.list.get(i)){
                continue;
            }
            this.list.get(i).acceptVisitor(visitor);
        }
        
    }

}

public interface IVisitor {
    public void visit(Manager manager);
    public void visit(Emploee emploee);
}

public class BaseInfoVisitor implements IVisitor {

    @Override
    public void visit(Manager manager) {
        System.out.println("-管理者");
        manager.printBaseInfo();
    }

    @Override
    public void visit(Emploee emploee) {
        System.out.println("-底层员工");
        emploee.printBaseInfo();

    }

}

public interface ISalaryVisitor extends IVisitor{
    public void printManagerTotalSalary();
    public void printEmploeeTotalSalary();
    public void printTotalSalary();
}

public class SalaryVisitor implements ISalaryVisitor {

    private float managerSalary;
    private float emploeeSalary;
    
    public SalaryVisitor() {
        this.managerSalary = 0;
        this.emploeeSalary = 0;
    }

    @Override
    public void printEmploeeTotalSalary() {
        System.out.println("底层员工薪资总合: "+emploeeSalary);
    }

    @Override
    public void printManagerTotalSalary() {
        System.out.println("管理者薪资总合: "+managerSalary);
    }

    @Override
    public void printTotalSalary() {
        System.out.println("所有员工薪资总合: "+(emploeeSalary+managerSalary));
    }

    @Override
    public void visit(Manager manager) {
        this.managerSalary += manager.getSalary();
    }

    @Override
    public void visit(Emploee emploee) {
        this.emploeeSalary += emploee.getSalary();
    }

}


测试

public class Client {

    public static void main(String[] args) {
        Emp bossEmp = new Manager("1", "大Boss", "CEO", 100000);
            Emp fianceEmp = new Manager("11", "张总", "财务经理", 60000);
            Emp personEmp = new Manager("12", "夏总", "人事经理", 60000);
            Emp techniEmp = new Manager("13", "熊总", "技术经理", 60000);
                Emp deptEmp = new Manager("1301", "王助理", "部门经理", 20000);
                Emp tecEmp = new Manager("1302", "车主管", "部门主管", 30000);
                    Emp softEng1 = new Emploee("1302001", "张三", "软件工程师", 5000);
                    Emp softEng2 = new Emploee("1302002", "李四", "硬件工程师", 5000);
                    Emp softEng3 = new Emploee("1302003", "王五", "测试工程师", 5000);
        tecEmp.addEmp(softEng1);
        tecEmp.addEmp(softEng2);
        tecEmp.addEmp(softEng3);
        
        techniEmp.addEmp(deptEmp);
        techniEmp.addEmp(tecEmp);
        
        bossEmp.addEmp(fianceEmp);
        bossEmp.addEmp(personEmp);
        bossEmp.addEmp(techniEmp);
        
        bossEmp.printBaseInfo();
        bossEmp.printEmpsInfo(1);
        System.out.println("-----------------------------------");
        techniEmp.printBaseInfo();
        techniEmp.printEmpsInfo(2);
        System.out.println("-----------------------------------");
        softEng1.printBaseInfo();
        softEng1.printEmpsInfo(4);
        
        
        System.out.println("-------------------==================----------------");
        bossEmp.acceptVisitor(new BaseInfoVisitor());
        
        ISalaryVisitor salaryVisitor = new SalaryVisitor();
        bossEmp.acceptVisitor(salaryVisitor );
        salaryVisitor.printEmploeeTotalSalary();
        salaryVisitor.printManagerTotalSalary();
        salaryVisitor.printTotalSalary();
        
    }

}


0 0
原创粉丝点击