访问者模式【Visitor Pattern】

来源:互联网 发布:广州天河大数据培训 编辑:程序博客网 时间:2024/05/21 17:19
Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。 package com.cbf4life.common;public abstract class Employee {public final static int MALE = 0; public final static int FEMALE = 1;private String name;private int salary;private int sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public final void report(){String info = "姓名:" + this.name + "\t";info = info + "性别:" + (this.sex == FEMALE?"女":"男") + "\t";info = info + "薪水:" + this.salary + "\t";info = info + this.getOtherInfo();System.out.println(info);}protected abstract String getOtherInfo();}package com.cbf4life.common;public class CommonEmployee extends Employee {private String job;public String getJob() {return job;}public void setJob(String job) {this.job = job;}protected String getOtherInfo(){return "工作:"+ this.job + "\t";}}package com.cbf4life.common;public class Manager extends Employee {private String performance;public String getPerformance() {return performance;}public void setPerformance(String performance) {this.performance = performance;}protected String getOtherInfo(){return "业绩:"+ this.performance + "\t";}}package com.cbf4life.common;import java.util.ArrayList;import java.util.List;public class Client {public static void main(String[] args) {for(Employee emp:mockEmployee()){emp.report();}}//模拟出公司的人员情况,我们可以想象这个数据室通过持久层传递过来的public static List<Employee> mockEmployee(){List<Employee> empList = new ArrayList<Employee>();CommonEmployee zhangSan = new CommonEmployee();zhangSan.setJob("编写Java程序,绝对的蓝领、苦工加搬运工");zhangSan.setName("张三");zhangSan.setSalary(1800);zhangSan.setSex(Employee.MALE);empList.add(zhangSan);CommonEmployee liSi = new CommonEmployee();liSi.setJob("页面美工,审美素质太不流行了!");liSi.setName("李四");liSi.setSalary(1900);liSi.setSex(Employee.FEMALE);empList.add(liSi);Manager wangWu = new Manager();wangWu.setName("王五");wangWu.setPerformance("基本上是负值,但是我会拍马屁呀");wangWu.setSalary(18750);wangWu.setSex(Employee.MALE);empList.add(wangWu);return empList;}}-------------------------------------------------------------------------------package com.cbf4life.common2;public interface IVisitor {public void visit(CommonEmployee commonEmployee);public void visit(Manager manager);}package com.cbf4life.common2;public class Visitor implements IVisitor {public void visit(CommonEmployee commonEmployee) {System.out.println(this.getCommonEmployee(commonEmployee));}public void visit(Manager manager) {System.out.println(this.getManagerInfo(manager));}private String getBasicInfo(Employee employee){String info = "姓名:" + employee.getName() + "\t";info = info + "性别:" + (employee.getSex() == Employee.FEMALE?"女":"男")+ "\t";info = info + "薪水:" + employee.getSalary() + "\t";return info;}private String getManagerInfo(Manager manager){String basicInfo = this.getBasicInfo(manager);String otherInfo = "业绩:"+manager.getPerformance() + "\t";return basicInfo + otherInfo;}private String getCommonEmployee(CommonEmployee commonEmployee){String basicInfo = this.getBasicInfo(commonEmployee);String otherInfo = "工作:"+commonEmployee.getJob()+"\t";return basicInfo + otherInfo;}}package com.cbf4life.common2;public abstract class Employee {public final static int MALE = 0; public final static int FEMALE = 1; private String name;private int salary;private int sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public abstract void accept(IVisitor visitor);}//删除了report 方法,增加了accept 方法package com.cbf4life.common2;public class CommonEmployee extends Employee {private String job;public String getJob() {return job;}public void setJob(String job) {this.job = job;}@Overridepublic void accept(IVisitor visitor){visitor.visit(this);}}package com.cbf4life.common2;public class Manager extends Employee {private String performance;public String getPerformance() {return performance;}public void setPerformance(String performance) {this.performance = performance;}@Overridepublic void accept(IVisitor visitor){visitor.visit(this);}}package com.cbf4life.common2;import java.util.ArrayList;import java.util.List;public class Client {public static void main(String[] args) {for(Employee emp:mockEmployee()){emp.accept(new Visitor());}}public static List<Employee> mockEmployee(){List<Employee> empList = new ArrayList<Employee>();CommonEmployee zhangSan = new CommonEmployee();zhangSan.setJob("编写Java程序,绝对的蓝领、苦工加搬运工");zhangSan.setName("张三");zhangSan.setSalary(1800);zhangSan.setSex(Employee.MALE);empList.add(zhangSan);CommonEmployee liSi = new CommonEmployee();liSi.setJob("页面美工,审美素质太不流行了!");liSi.setName("李四");liSi.setSalary(1900);liSi.setSex(Employee.FEMALE);empList.add(liSi);Manager wangWu = new Manager();wangWu.setName("王五");wangWu.setPerformance("基本上是负值,但是我会拍马屁呀");wangWu.setSalary(18750);wangWu.setSex(Employee.MALE);empList.add(wangWu);return empList;}}------------------------------------------------------------------------------------------------------------------------------//就在接口上增加了一个getTotalSalary 方法package com.cbf4life.extend;/*** 访问者,我要去访问人家的数据了*/public interface IVisitor {public void visit(CommonEmployee commonEmployee);public void visit(Manager manager);//统计所有员工工资总和public int getTotalSalary();}package com.cbf4life.extend;public class Visitor implements IVisitor {//部门经理的工资系数是5private final static int MANAGER_COEFFICIENT = 5;//员工的工资系数是2private final static int COMMONEMPLOYEE_COEFFICIENT = 2;//普通员工的工资总和private int commonTotalSalary = 0;//部门经理的工资总和private int managerTotalSalary =0;public void visit(CommonEmployee commonEmployee) {System.out.println(this.getCommonEmployee(commonEmployee));this.calCommonSlary(commonEmployee.getSalary());}public void visit(Manager manager) {System.out.println(this.getManagerInfo(manager));this.calManagerSalary(manager.getSalary());}private String getBasicInfo(Employee employee){String info = "姓名:" + employee.getName() + "\t";info = info + "性别:" + (employee.getSex() == Employee.FEMALE?"女":"男")+ "\t";info = info + "薪水:" + employee.getSalary() + "\t";return info;}private String getManagerInfo(Manager manager){String basicInfo = this.getBasicInfo(manager);String otherInfo = "业绩:"+manager.getPerformance() + "\t";return basicInfo + otherInfo;}private String getCommonEmployee(CommonEmployee commonEmployee){String basicInfo = this.getBasicInfo(commonEmployee);String otherInfo = "工作:"+commonEmployee.getJob()+"\t";return basicInfo + otherInfo;}private void calManagerSalary(int salary){this.managerTotalSalary = this.managerTotalSalary + salary*MANAGER_COEFFICIENT ;}private void calCommonSlary(int salary){this.commonTotalSalary = this.commonTotalSalary +salary*COMMONEMPLOYEE_COEFFICIENT;}public int getTotalSalary(){return this.commonTotalSalary + this.managerTotalSalary;}}package com.cbf4life.extend;import java.util.ArrayList;import java.util.List;public class Client {public static void main(String[] args) {IVisitor visitor = new Visitor();for(Employee emp:mockEmployee()){emp.accept(visitor);}System.out.println("本公司的月工资总额是:"+visitor.getTotalSalary());}}-------------------------------------------------------------------------------------------------------------------------------------------package com.cbf4life.extend2;public interface IVisitor {public void visit(CommonEmployee commonEmployee);public void visit(Manager manager);}package com.cbf4life.extend2;/*** * 负责统计报表的产生*/public interface ITotalVisitor extends IVisitor {public void totalSalary();}package com.cbf4life.extend2;/*** 负责展示报表的产生*/public interface IShowVisitor extends IVisitor {public void report();}package com.cbf4life.extend2;public class ShowVisitor implements IShowVisitor {private String info = "";public void report() {System.out.println(this.info);}public void visit(CommonEmployee commonEmployee) {this.info = this.info + this.getBasicInfo(commonEmployee)+ "工作:"+commonEmployee.getJob()+"\t\n";}public void visit(Manager manager) {this.info = this.info + this.getBasicInfo(manager) + "业绩:"+manager.getPerformance() + "\t\n";}private String getBasicInfo(Employee employee){String info = "姓名:" + employee.getName() + "\t";info = info + "性别:" + (employee.getSex() == Employee.FEMALE?"女":"男")+ "\t";info = info + "薪水:" + employee.getSalary() + "\t";return info;}}package com.cbf4life.extend2;/*** * 汇总表,该访问者起汇总作用,把容器中的数据一个一个遍历,然后汇总*/public class TotalVisitor implements ITotalVisitor {private final static int MANAGER_COEFFICIENT = 5;private final static int COMMONEMPLOYEE_COEFFICIENT = 2;private int commonTotalSalary = 0;private int managerTotalSalary =0;public void totalSalary() {System.out.println("本公司的月工资总额是" + (this.commonTotalSalary +this.managerTotalSalary));}public void visit(CommonEmployee commonEmployee) {this.commonTotalSalary = this.commonTotalSalary +commonEmployee.getSalary()*COMMONEMPLOYEE_COEFFICIENT;}public void visit(Manager manager) {this.managerTotalSalary = this.managerTotalSalary + manager.getSalary()*MANAGER_COEFFICIENT ;}}package com.cbf4life.extend2;import java.util.ArrayList;import java.util.List;public class Client {public static void main(String[] args) {IShowVisitor showVisitor = new ShowVisitor();ITotalVisitor totalVisitor = new TotalVisitor();for(Employee emp:mockEmployee()){emp.accept(showVisitor); emp.accept(totalVisitor);}showVisitor.report();totalVisitor.totalSalary();}}
原创粉丝点击