美文网首页
23种设计模式-访问者模式(CEO、CTO)

23种设计模式-访问者模式(CEO、CTO)

作者: 王灵 | 来源:发表于2019-02-28 23:15 被阅读0次

定义:封装一些作用于某种数据结构中各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新操作。
使用场景:
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());
    }
}

相关文章

网友评论

      本文标题:23种设计模式-访问者模式(CEO、CTO)

      本文链接:https://www.haomeiwen.com/subject/yepluqtx.html