无废话设计模式(19)行为模式--访问者模式

0-前言

  访问者模式(Visitor)定义:

      表示一个作用于某对象结构中的各元素的操作。

      它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

1-实现

1-1、简单UML图

 

 1-2、代码实现

//1、Visitor父类------------------------------------------
abstract class Leader
{
    public abstract void VisitFinanceReport(FinanceReport financeReport);
    public  abstract void VisitLogisticsReport(LogisticsReport logisticsReport);
}
//1-1、具体访问者A--财务总监
class FinanceLeader extends Leader
{
    @Override
    public void VisitFinanceReport(FinanceReport financeReport)
    {
        System.out.println("根据财务报表,营业收入为:"+financeReport.getIncome());
    }

    @Override
    public void VisitLogisticsReport(LogisticsReport logisticsReport)
    {

    }
}
//1-2、具体访问者B--销售总监
class LogisticeLeader extends Leader
{
    @Override
    public void VisitFinanceReport(FinanceReport financeReport)
    {

    }

    @Override
    public void VisitLogisticsReport(LogisticsReport logisticsReport)
    {
        System.out.println("根据销售报表,销售额为:"+logisticsReport.getSell());
    }
}

//2、元素父类----------------------------------------------------
abstract class Report
{
    public abstract void Accept(Leader leader);
}
//2-1、元素A--财务报表
class FinanceReport extends Report
{
    public  int  getIncome()
    {
        return 100000;
    }

    @Override
    public void Accept(Leader leader)
    {
        leader.VisitFinanceReport(this);
    }
}
//2-2、元素B--销售报表
class LogisticsReport extends Report
{
    public  int  getSell()
    {
        return 90000;
    }

    @Override
    public void Accept(Leader leader)
    {
        leader.VisitLogisticsReport(this);
    }
}
//3、元素结构类--------------------------------------------------
class  ReportBox
{
    private List<Report> reports = new ArrayList<>();
    //加入报表
    public void Add(Report _report)
    {
        reports.add(_report);
    }
    //删除报表
    public void Remove(Report _report)
    {
        reports.remove(_report);
    }
    //访问方法
    public void Accept(Leader leader)
    {
        for(Report rp : reports)
        {
            rp.Accept(leader);
        }
    }

 

客户端

        ReportBox rb=new ReportBox();  //结构
        rb.Add(new FinanceReport());
        rb.Add(new LogisticsReport());

        FinanceLeader fl = new FinanceLeader(); //访问者
        LogisticeLeader ll = new LogisticeLeader(); //访问者
        rb.Accept(fl);
        rb.Accept(ll);

 

运行结果

 

 

2、应用场景简单总结

1、当一个对象结构包含很多类对象,希望对这些对象实施一些依赖于其具体类的操作时;

2、当对象结构被很多应用共享时;

posted @ 2020-08-07 17:55  程序员恒哥  阅读(196)  评论(0编辑  收藏  举报