从不同角度看同一数据结构-访问者模式

访问者模式是一种复杂的设计模式,使用频率不高,下面举一个公司对员工业绩考核的例子,CEO和CTO对员工的考核标准是不一样的

员工抽象类
public abstract class Staff {
    public String name;
    public int kpi;
    public Staff(String name) {
        this.name = name;
        kpi = new Random().nextInt(10);
    }

    public abstract void accept(Visitor visitor);
}

基类中只有员工的公共属性,这里是姓名和kpi

员工具体类
  1. 工程师类
public class Engineer extends Staff {
    public Engineer(String name) {
        super(name);
    }

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

    public int getCodeLines() {
        return new Random().nextInt(10*10000);
    }
}
  1. 产品经理类
public class Manager extends Staff {
    public Manager(String name) {
        super(name);
    }

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

    public int getProducts() {
        return new Random().nextInt(10);
    }
}

在具体类中加入独特的属性,这样访问者访问时就可以区别对待

抽象访问者类
public interface Visitor {
    void visit(Engineer engineer);
    void visit(Manager manager);
}
具体访问类
  1. CEO:只关心员工的姓名和KPI
public class CEO implements Visitor {
    @Override
    public void visit(Engineer engineer) {
        System.out.println("Engineer:"+ engineer.name + ", kpi: " +engineer.kpi);
    }

    @Override
    public void visit(Manager manager) {
        System.out.println("Manager: "+ manager.name + ", kpi: "+manager.kpi);
    }
}
  1. CTO:根据岗位的不同关心不同的技术指标
public class CTO implements Visitor {
    @Override
    public void visit(Engineer engineer) {
        System.out.println("Engineer: " + engineer.name +", code: " + engineer.getCodeLines());
    }

    @Override
    public void visit(Manager manager) {
        System.out.println("Manager: " + manager.name + ", product: "+ manager.getProducts());
    }
}

具体示例如下

public class Main {
    public static void main(String[] args) {
        BusinessReport businessReport = new BusinessReport();
        System.out.println("======CEO=====");
        businessReport.showReport(new CEO());
        System.out.println("\n=====CTO=====");
        businessReport.showReport(new CTO());
    }
}

结果

捕获.PNG

访问者模式可以很方便地添加访问者,方便地从多种角度观察同一种数据结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值