访问者模式

来源:互联网 发布:萧山网络问政关注 编辑:程序博客网 时间:2024/06/06 22:59

1类图

这里写图片描述

2定义

封装一些作用与某些数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用与这些元素的新操作。

3应用场景

1 对象结构比较稳定,但经常需要对此对象结构上定义新的操作。

2 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新的操作时修改这些类。

4员工基类

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);}

5工程师类

public class Engineer extends Staff {    public Engineer(String name) {        super(name);        // TODO Auto-generated constructor stub    }    @Override    public void accept(Visitor visitor) {        // TODO Auto-generated method stub        visitor.visit(this);    }    public int getCodeLine(){        return new Random().nextInt(10 * 10000);    }}

6经理类

public class Manager extends Staff {    public Manager(String name) {        super(name);        // TODO Auto-generated constructor stub    }    @Override    public void accept(Visitor visitor) {        // TODO Auto-generated method stub        visitor.visit(this);    }    public int getProducts(){        return new Random().nextInt();     }}

7员工业务报表1类

public class BusinessReport {    List<Staff> list = new ArrayList<>();    public BusinessReport(){        list.add(new Manager("张三"));        list.add(new Engineer("工程师-李四"));        list.add(new Engineer("工程师-李四1"));        list.add(new Engineer("工程师-李四2"));        list.add(new Engineer("工程师-李四3"));    }    public void showReport(Visitor visitor){        for (Staff staff : list) {            staff.accept(visitor);        }    }}

8员工属性接口

public interface Visitor {    public void visit(Engineer engineer);    public void visit(Manager manager);}

9CEO访问者 关心业绩

public class CEOVisitor implements Visitor {    @Override    public void visit(Engineer engineer) {        // TODO Auto-generated method stub        System.out.println(engineer.name + "   " + engineer.kpi);    }    @Override    public void visit(Manager manager) {        // TODO Auto-generated method stub        System.out.println(manager.name + "  " + manager.kpi + manager.getProducts());    }}

10分别处理两类员工

public class ReportUitl {    public void visitor(Staff staff){        if(staff instanceof Manager){            Manager manager = (Manager) staff;            System.out.println(manager.name + "  " + manager.kpi + manager.getProducts());        }else {            Engineer engineer = (Engineer) staff;            System.out.println(engineer.name + "   " + engineer.kpi);        }    }}

11CTO访问者 关心技术

public class CTOVisitor implements Visitor {    @Override    public void visit(Engineer engineer) {        // TODO Auto-generated method stub        System.out.println(engineer.name + "   " + engineer.kpi + " " + engineer.getCodeLine());    }    @Override    public void visit(Manager manager) {        // TODO Auto-generated method stub        System.out.println(manager.name + "  " + manager.kpi + manager.getProducts());    }}

12测试类

public static void main(String[] args) {        BusinessReport report = new BusinessReport();        System.out.println("=======  CEO ========");        report.showReport(new CEOVisitor());        System.out.println("=======  CTO ========");        report.showReport(new CTOVisitor());    }
原创粉丝点击