前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >visitor设计模式ppt_常用的设计模式

visitor设计模式ppt_常用的设计模式

作者头像
全栈程序员站长
发布2022-09-21 08:22:52
2300
发布2022-09-21 08:22:52
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

动机

Visitor是访问者的意思。 数据结构中保存着元素。一般我们需要对元素进行处理,那么处理元素的代码放在哪里呢?最显然的方法就是放在数据结构的类中,在类中添加处理的方法。但是如果有很多处理,就比较麻烦了,每当增加一种处理,我们就不得不去修改表示数据结构的类。 visitor模式就是用来解决这个问题的,visitor模式将数据结构的定义和处理分离开。也就是会新增一个访问者的类,将数据元素的处理交给访问者类,这样以后要新增处理的时候,只需要新增访问者就可以了。

模式定义

将更新(变更)封装到一个类中(访问操作),并由待更改类提供一个接收接口,则可达到效果。

实例

代码语言:javascript
复制
//visit.h
 
#ifndef VISITOR_H
#define VISITOR_H
 
#include <iostream>
#include <string>
#include <vector>
 
class Element;
class CPU;
class VideoCard;
class MainBoard;
 
/*------------------*/
class Visitor { 
   
public:
    Visitor(std::string name) { 
   
        visitorName = name;
    }
    virtual void visitCPU( CPU* cpu ) { 
   };
    virtual void visitVideoCard( VideoCard* videoCard ) { 
   };
    virtual void visitMainBoard( MainBoard* mainBoard ) { 
   };
 
 
    std::string getName() { 
   
        return this->visitorName;
    };
private:
    std::string visitorName;
};
 
 
class Element { 
   
public:
    Element( std::string name ) { 
   
        eleName = name;
    }
    virtual void accept( Visitor* visitor ) { 
   };
 
    virtual std::string getName() { 
   
        return this->eleName;
    }
private:
    std::string eleName;
};
 
/*----------- Elements -------------*/
 
class CPU : public Element { 
   
public:
    CPU(std::string name) : Element(name) { 
   }
 
    void accept(Visitor* visitor) { 
   
        visitor->visitCPU(this);
    }
};
 
class VideoCard : public Element { 
   
public:
    VideoCard(std::string name) : Element(name) { 
   }
 
    void accept(Visitor* visitor) { 
   
        visitor->visitVideoCard(this);
    }
};
 
class MainBoard : public Element { 
   
public:
    MainBoard(std::string name) : Element(name) { 
   }
      
    void accept(Visitor* visitor) { 
   
        visitor->visitMainBoard(this);
    }
};
 
/*----------- ConcreteVisitor -------------*/
 
class CircuitDetector : public Visitor { 
   
public:
    CircuitDetector(std::string name) : Visitor(name) { 
   }
 
    // checking cpu
    void visitCPU( CPU* cpu ) { 
   
        std::cout << Visitor::getName() << " is checking CPU's circuits.(" << cpu->getName()<<")" << std::endl;
    }
 
    // checking videoCard
    void visitVideoCard( VideoCard* videoCard ) { 
   
        std::cout << Visitor::getName() << " is checking VideoCard's circuits.(" << videoCard->getName()<<")" << std::endl;
    }
 
    // checking mainboard
    void visitMainBoard( MainBoard* mainboard ) { 
   
        std::cout << Visitor::getName() << " is checking MainBoard's circuits.(" << mainboard->getName() <<")" << std::endl;
    }
 
};
 
class FunctionDetector : public Visitor { 
   
public:
    FunctionDetector(std::string name) : Visitor(name) { 
   }
    virtual void visitCPU( CPU* cpu ) { 
   
        std::cout << Visitor::getName() << " is check CPU's function.(" << cpu->getName() << ")"<< std::endl;
    }
 
    // checking videoCard
    void visitVideoCard( VideoCard* videoCard ) { 
   
        std::cout << Visitor::getName() << " is checking VideoCard's function.(" << videoCard->getName()<< ")" << std::endl;
    }
 
    // checking mainboard
    void visitMainBoard( MainBoard* mainboard ) { 
   
        std::cout << Visitor::getName() << " is checking MainBoard's function.(" << mainboard->getName() << ")"<< std::endl;
    }
};
 
 
/*------------------------*/
 
class Computer { 
   
public:
    Computer(CPU* cpu,
            VideoCard* videocard,
            MainBoard* mainboard) { 
   
        elementList.push_back(cpu);
        elementList.push_back(videocard);
        elementList.push_back(mainboard);
    };
    void Accept(Visitor* visitor) { 
   
        for( std::vector<Element*>::iterator i = elementList.begin(); i != elementList.end(); i++ )
        { 
   
            (*i)->accept(visitor);
        }
    }; 
private:
    std::vector<Element*> elementList;
};

结构

加粗样式
加粗样式

笔记

  • 就是将数据结构和操作 分离开

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168496.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 动机
  • 模式定义
  • 实例
  • 结构
  • 笔记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档