设计模式之访问模式18

设计模式之访问模式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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值