设计模式读书笔记-访问者模式

2016-08-21
读书笔记
  • 定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
  • 业务类A为类B、C的公共属性的方法,B、C均继承A,但又有各自的属性和方法
  • 业务类A中包含一个公共方法accept(Visitor),其参数为一个观察者对象,B、C具体实现visitor.visit(this);
  • 访问者类D会针对B、C各自实例一个具体方法,参数分别为B、C
  • 代码:
public abstract class Employee {

    public final static int MALE = 0; //0代表是男性
    public final static int FEMALE = 1; //1代表是女性

    private String name;//甭管是谁,都有工资   get set
    private int salary;//只要是员工那就有薪水   get set
    private int sex;//性别很重要   get set

    public abstract void accept(VisitorInterface visitor);//允许一个访问者访问

}

public class CommonEmployee extends Employee{
    private String job;//get set

    public void accept(VisitorInterface visitor) {
        visitor.visit(this);
    }
}

public class Manager extends Employee{
    private String performance;//get set

    public void accept(VisitorInterface visitor) {
        visitor.visit(this);
    }
}

public interface VisitorInterface {
    public void visit(CommonEmployee commonEmployee);//首先定义可访问普通员工
    public void visit(Manager manager);//其次定义,我还可以访问部门经理
}

public class Visitor implements VisitorInterface{
    public void visit(CommonEmployee commonEmployee) {
        String commonEmployeeInfo = getCommonEmployee(commonEmployee);
        System.out.println(commonEmployeeInfo);
    }

    public void visit(Manager manager) {
        String managerInfo = getManagerInfo(manager);
        System.out.println(managerInfo);
    }

    //组装出基本信息
    private String getBasicInfo(Employee employee){
        String info = "姓名:" + employee.getName() + "\t";
        info = info + "性别:" + (employee.getSex() == Employee.FEMALE?"女":"男") + "\t";
        info = info + "薪水:" + employee.getSalary() + "\t";
        return info;
    }

    private String getCommonEmployee(CommonEmployee commonEmployee){
        String basicInfo = this.getBasicInfo(commonEmployee);
        String otherInfo = "工作:"+commonEmployee.getJob()+"\t";
        return basicInfo + otherInfo;
    }

    private String getManagerInfo(Manager manager){
        String basicInfo = this.getBasicInfo(manager);
        String otherInfo = "业绩:"+manager.getPerformance() + "\t";
        return basicInfo + otherInfo;
    }
}

public class Client {
    public static void main(String[] args){
        for(Employee emp:mockEmployee()){
            emp.accept(new Visitor());
        }
    }

    //模拟出公司的人员情况,我们可以想象这个数据室通过持久层传递过来的
    public static List<Employee> mockEmployee(){

        List<Employee> empList = new ArrayList<Employee>();

        //产生张三这个员工
        CommonEmployee zhangSan = new CommonEmployee();
        zhangSan.setJob("编写Java程序,绝对的蓝领、苦工加搬运工");
        zhangSan.setName("张三");
        zhangSan.setSalary(1800);
        zhangSan.setSex(Employee.MALE);
        empList.add(zhangSan);

        //产生李四这个员工
        CommonEmployee liSi = new CommonEmployee();
        liSi.setJob("页面美工,审美素质太不流行了!");
        liSi.setName("李四");
        liSi.setSalary(1900);
        liSi.setSex(Employee.FEMALE);
        empList.add(liSi);

        //再产生一个经理
        Manager wangWu = new Manager();
        wangWu.setName("王五");
        wangWu.setPerformance("基本上是负值,但是我会拍马屁呀");
        wangWu.setSalary(18750);
        wangWu.setSex(Employee.MALE);
        empList.add(wangWu);

        return empList;
    }
}

Kommentare: