设计模式之访问模式18

来源:互联网 发布:python生成100个随机数 编辑:程序博客网 时间:2024/05/17 21:31

设计模式之访问模式18

背景

如果希望能打印出所有员工的信息(普通员工,经理)。普通的模板方法可以实现。现在尝试下访问模式。拆分对象:员工,普通员工,经理,访问类(集中访问信息的操作)

类图

设计模式之访问模式

代码实现、

定义一个员工抽象类,所有角色都继承该类。

public abstract class Employee {    private String name;    private Double salary;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Double getSalary() {        return salary;    }    public void setSalary(Double salary) {        this.salary = salary;    }    public abstract void accept(IVisitor visitor); }

定义一个普通员工

public class CommonEmployee extends Employee{    private String job;    public String getJob() {        return job;    }    public void setJob(String job) {        this.job = job;    }    //设置允许访问    @Override    public void accept(IVisitor visitor) {        visitor.visit(this);    }    public CommonEmployee(String name, Double salary, String job) {        super.setName(name);        super.setSalary(salary);        this.job = job;    }}

定义经理

public class Manager extends Employee {    private String performance;    public String getPerformance() {        return performance;    }    public void setPerformance(String performance) {        this.performance = performance;    }    //设置允许访问者访问    @Override    public void accept(IVisitor visitor) {        visitor.visit(this);    }    public Manager(String name, Double salary, String performance) {        super.setName(name);        super.setSalary(salary);        this.performance = performance;    }}

定义访问类的接口,支持哪些类的访问

public interface IVisitor {    public void visit(CommonEmployee commonEmployee);    public void visit(Manager manager);}

具体实现访问类,将动作集中在这里

public class Visitor implements IVisitor {    public void visit(CommonEmployee commonEmployee) {        System.out.println(this.getCommonEmployeeInfo(commonEmployee));    }    public void visit(Manager manager) {        System.out.println(this.getManagerInfo(manager));    }    public String getBasicInfo(Employee employee) {        return employee.getName() + "\t" + employee.getSalary() + "\t";    }    public String getManagerInfo(Manager manager) {        return this.getBasicInfo(manager) + manager.getPerformance() + "\t";    }    public String getCommonEmployeeInfo(CommonEmployee commonEmployee) {        return this.getBasicInfo(commonEmployee) + commonEmployee.getJob() + "\t";    }}

客户端调用

public class Client {    public static void main(String[] args) {        Visitor visitor = new Visitor();        for(Employee employee : getData()) {            employee.accept(visitor);        }    }    public static List<Employee> getData() {        List<Employee> list = new ArrayList<Employee>();        list.add(new CommonEmployee("张三", 1000.0, "撸Java"));        list.add(new CommonEmployee("李四", 1100.0, "撸JS"));        list.add(new Manager("王五", 11000.0, "吹牛比"));        return list;    }}

运行结果如下

张三  1000.0  撸Java   李四  1100.0  撸JS 王五  11000.0 吹牛比 
1 0
原创粉丝点击