zoukankan      html  css  js  c++  java
  • 无废话设计模式(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、当对象结构被很多应用共享时;

  • 相关阅读:
    C语言学习笔记之 程序流程结构
    C语言学习笔记之 类型转换
    C语言学习笔记之 标准输入输出函数
    C语言学习笔记之 运算符
    bzoj 4322 东西分配问题
    bzoj 3240 矩阵乘法+十进制快速幂
    bzoj 4017 子序列和的异或以及异或的和
    bzoj 1934 最小割
    bzoj 3275 最小割
    bzoj 3931 最短路+最大流
  • 原文地址:https://www.cnblogs.com/yanghj/p/13454365.html
Copyright © 2011-2022 走看看