定义:封装一些作用于某种数据结构中各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新操作。
使用场景:
1、对象结构比较稳定,但经常需要在此对象结构上定义新操作。
2、需要对一个对象结构中的对象进行很多不同且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。
/**
* 员工基类
*/
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);
}
/**
* 工程师
*/
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);
}
}
/**
* 经理类型
*/
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 {
//访问工程师类型
public void visit(Engineer engineer);
//访问经理类型
public void visit(Manager manager);
}
//员工业务报表
public class BusinessReport {
List<Staff> mStaffs = new LinkedList<>();
public BusinessReport() {
mStaffs.add(new Manager("王经理"));
mStaffs.add(new Engineer("工程师-Shawn.Xiong"));
mStaffs.add(new Engineer("工程师-Kael"));
mStaffs.add(new Engineer("工程师-Chaossss"));
mStaffs.add(new Engineer("工程师-Tiiime"));
}
public void showReport(Visitor visitor) {
for (Staff staff : mStaffs) {
staff.accept(visitor);
}
}
}
/**
* CEO访问者
*/
public class CEOVisitor implements Visitor {
@Override
public void visit(Engineer engineer) {
Log.e("工程师:" + engineer.name + ",KPI:" + engineer.kpi);
}
@Override
public void visit(Manager manager) {
Log.e("经理:" + manager.name + ",KPI:" + manager.kpi + ",新产品数量:" + manager.getProducts());
}
}
public class CTOVisitor implements Visitor {
@Override
public void visit(Engineer engineer) {
Log.e("工程师:"+engineer.name+",代码函数:"+engineer.getCodeLines());
}
@Override
public void visit(Manager manager) {
Log.e("经理:"+manager.name+",产品数量:"+manager.getProducts());
}
}
public class Client {
public static void main(String[] args) {
//构建报表
BusinessReport report = new BusinessReport();
Log.e("========给CEO看的报表========");
report.showReport(new CEOVisitor());
Log.e("========给CTO看的报表========");
report.showReport(new CTOVisitor());
}
}
网友评论