设计模式之访问者模式(行为型)

定义

  • 概念
    它是一种将数据结构与数据操作分离的设计模式,指封装一些作用于某种数据结构中的各元素的操作
  • 应用场景
    • 数据结构稳定,作用于于数据结构的操作经常变化的场景
    • 需要数据结构与数据操作分离的场景
    • 需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景

写法

CTO和CEO去访问员工的业绩,但两者关注的点不一样,CTO关注代码数量和产品数量,CEO关注KPI

public interface IVisitor {

    void visit(Engineer engineer);

    void visit(Manager manager);

}
public class CEOVistitor implements IVisitor {
    public void visit(Engineer engineer) {
        System.out.println("工程师" +  engineer.name + ",KIP:" + engineer.kpi);
    }

    public void visit(Manager manager) {
        System.out.println("经理:" +  manager.name + ",KPI:" + manager.kpi + ",产品数量:" + manager.getProducts());
    }
}
public class CTOVistitor implements IVisitor {
    public void visit(Engineer engineer) {
        System.out.println("工程师" +  engineer.name + ",代码行数:" + engineer.getCodeLines());
    }

    public void visit(Manager manager) {
        System.out.println("经理:" +  manager.name + ",产品数量:" + manager.getProducts());
    }
}
public abstract class Employee {
    public String name;
    public int kpi;  //员工KPI

    public Employee(String name) {
        this.name = name;
        kpi = new Random().nextInt(10);
    }

    //接收访问者的访问
    public abstract void accept(IVisitor visitor);
}
public class Engineer extends Employee {
    public Engineer(String name) {
        super(name);
    }

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

    //考核指标是每年的代码量
    public int getCodeLines(){
        return new Random().nextInt(10* 10000);
    }
}
public class Manager extends Employee {
    public Manager(String name) {
        super(name);
    }

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

    //考核的是每年新产品研发数量
    public int getProducts(){
        return new Random().nextInt(10);
    }
}
public class BusinessReport {
    private List<Employee> employees = new LinkedList<Employee>();

    public BusinessReport() {
        employees.add(new Manager("产品经理A"));
        employees.add(new Engineer("程序员A"));
        employees.add(new Engineer("程序员B"));
        employees.add(new Engineer("程序员C"));
        employees.add(new Manager("产品经理B"));
        employees.add(new Engineer("程序员D"));
    }

    public void showReport(IVisitor visitor){
        for (Employee employee : employees) {
            employee.accept(visitor);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        BusinessReport report = new BusinessReport();
        System.out.println("==========CEO看报表===============");
        report.showReport(new CEOVistitor());
        System.out.println("==========CTO看报表===============");
        report.showReport(new CTOVistitor());
    }
}
==========CEO看报表===============
经理:产品经理A,KPI:2,产品数量:9
工程师程序员A,KIP:9
工程师程序员B,KIP:1
工程师程序员C,KIP:0
经理:产品经理B,KPI:4,产品数量:3
工程师程序员D,KIP:0
==========CTO看报表===============
经理:产品经理A,产品数量:9
工程师程序员A,代码行数:83538
工程师程序员B,代码行数:48410
工程师程序员C,代码行数:2103
经理:产品经理B,产品数量:8
工程师程序员D,代码行数:44941
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值