访问者模式(大话设计模式)C/C++版本
创始人
2025-01-08 17:05:27
0

访问者模式

C++

#include  #include  using namespace std;  class Visitor;  // 组成Computer的各组件基类 class Element { public:     Element(string strName) : m_strName(strName) {}     string GetName()     {         return m_strName;     }     // 组件接受访问者访问的接口     virtual void AcceptVisitor(Visitor *pVisitor) = 0;  private:     // 组件的标识名称     string m_strName; };  // 访问者基类,针对不同组件,提供不同的访问接口 class Visitor { public:     virtual void VisitCPU(Element *pEle) = 0;     virtual void VisitGPU(Element *pEle) = 0;     virtual void VisitDISK(Element *pEle) = 0; };  // Computer类,由各组件组成,访问者访问Computer时将依次访问各组件 class Computer { public:     ~Computer()     {         for (Element *pElement : m_listEle)         {             delete pElement;         }     }      void AddElement(Element *pEle)     {         m_listEle.push_back(pEle);     }      void DelElement(Element *pEle)     {         m_listEle.remove(pEle);     }      // 访问者访问Computer时将依次访问各组件     void AcceptVisitor(Visitor *pVisitor)     {         for (Element *pElement : m_listEle)         {             pElement->AcceptVisitor(pVisitor);         }     }  private:     list m_listEle; };  // 访问者实现类,实现各自的访问方法 class VisitorA : public Visitor { public:     void VisitCPU(Element *pEle)     {         printf("Visitor A record CPU's name:%s\n", pEle->GetName().c_str());     }      void VisitGPU(Element *pEle)     {         printf("Visitor A do nothing to GPU:%s\n", pEle->GetName().c_str());     }      void VisitDISK(Element *pEle)     {         printf("Visitor A change DISK:%s\n", pEle->GetName().c_str());     } };  class VisitorB : public Visitor { public:     void VisitCPU(Element *pEle)     {         printf("Visitor B do nothing to CPU:%s\n", pEle->GetName().c_str());     }      void VisitGPU(Element *pEle)     {         printf("Visitor B record GPU's name:%s\n", pEle->GetName().c_str());     }      void VisitDISK(Element *pEle)     {         printf("Visitor B do nothing to DISK:%s\n", pEle->GetName().c_str());     } };  // 组件的实现类,调用访问者相应的访问方法 class CPU : public Element { public:     CPU(string strName) : Element(strName) {}     void AcceptVisitor(Visitor *pVisitor)     {         pVisitor->VisitCPU(this);     } };  class GPU : public Element { public:     GPU(string strName) : Element(strName) {}     void AcceptVisitor(Visitor *pVisitor)     {         pVisitor->VisitGPU(this);     } };  class Disk : public Element { public:     Disk(string strName) : Element(strName) {}     void AcceptVisitor(Visitor *pVisitor)     {         pVisitor->VisitDISK(this);     } };  int main() {     Computer oComputer;     oComputer.AddElement(new CPU("i9-10980XE"));     oComputer.AddElement(new GPU("Titan RTX"));     oComputer.AddElement(new Disk("HOF PRO M.2"));      VisitorA oVisitorA;     VisitorB oVisitorB;      oComputer.AcceptVisitor(&oVisitorA);     oComputer.AcceptVisitor(&oVisitorB);      return 0; } 

C

#include  #include  #include   typedef struct Element Element; typedef struct Visitor Visitor; typedef struct Computer Computer; typedef struct CPU CPU; typedef struct GPU GPU; typedef struct Disk Disk;  // 组件基类 struct Element {     char *m_strName;     void (*accept)(struct Element *, struct Visitor *); };  // 访问者基类 struct Visitor {     void (*visitCPU)(struct Element *);     void (*visitGPU)(struct Element *);     void (*visitDisk)(struct Element *); };  // Computer类 struct Computer {     struct Element **m_listEle;     size_t m_listSize;     size_t m_listCapacity; };  // CPU类 struct CPU {     struct Element base; };  // GPU类 struct GPU {     struct Element base; };  // Disk类 struct Disk {     struct Element base; };  // 创建组件 struct Element *createElement(const char *name, void (*accept)(struct Element *, struct Visitor *)) {     struct Element *element = malloc(sizeof(struct Element));     element->m_strName = strdup(name);     element->accept = accept;     return element; }  // 创建访问者 struct Visitor *createVisitor(void (*visitCPU)(struct Element *),                               void (*visitGPU)(struct Element *),                               void (*visitDisk)(struct Element *)) {     struct Visitor *visitor = malloc(sizeof(struct Visitor));     visitor->visitCPU = visitCPU;     visitor->visitGPU = visitGPU;     visitor->visitDisk = visitDisk;     return visitor; }  // 创建Computer struct Computer *createComputer() {     struct Computer *computer = malloc(sizeof(struct Computer));     computer->m_listEle = NULL;     computer->m_listSize = 0;     computer->m_listCapacity = 0;     return computer; }  // 添加组件到Computer void addElement(struct Computer *computer, struct Element *element) {     if (computer->m_listSize >= computer->m_listCapacity)     {         size_t newCapacity = computer->m_listCapacity == 0 ? 1 : computer->m_listCapacity * 2;         computer->m_listEle = realloc(computer->m_listEle, newCapacity * sizeof(struct Element *));         computer->m_listCapacity = newCapacity;     }     computer->m_listEle[computer->m_listSize++] = element; }  // 删除组件 void delElement(struct Computer *computer, struct Element *element) {     size_t i;     for (i = 0; i < computer->m_listSize; i++)     {         if (computer->m_listEle[i] == element)         {             memmove(&computer->m_listEle[i], &computer->m_listEle[i + 1], (computer->m_listSize - i - 1) * sizeof(struct Element *));             computer->m_listEle[--computer->m_listSize] = NULL;             break;         }     } }  // 访问者访问Computer void acceptVisitor(struct Computer *computer, struct Visitor *visitor) {     size_t i;     for (i = 0; i < computer->m_listSize; i++)     {         computer->m_listEle[i]->accept(computer->m_listEle[i], visitor);     } }  // 清理Computer void clearComputer(struct Computer *computer) {     size_t i;     for (i = 0; i < computer->m_listSize; i++)     {         free(computer->m_listEle[i]->m_strName);         free(computer->m_listEle[i]);     }     free(computer->m_listEle);     free(computer); }  // 访问者A实现 void visitorAVisitCPU(struct Element *ele) {     printf("Visitor A record CPU's name:%s\n", ele->m_strName); } void visitorAVisitGPU(struct Element *ele) {     printf("Visitor A do nothing to GPU:%s\n", ele->m_strName); } void visitorAVisitDisk(struct Element *ele) {     printf("Visitor A change DISK:%s\n", ele->m_strName); }  // 访问者B实现 void visitorBVisitCPU(struct Element *ele) {     printf("Visitor B do nothing to CPU:%s\n", ele->m_strName); } void visitorBVisitGPU(struct Element *ele) {     printf("Visitor B record GPU's name:%s\n", ele->m_strName); } void visitorBVisitDisk(struct Element *ele) {     printf("Visitor B do nothing to DISK:%s\n", ele->m_strName); }  int main() {     struct Computer *oComputer = createComputer();     addElement(oComputer, createElement("i9-10980XE", visitorAVisitCPU));     addElement(oComputer, createElement("Titan RTX", visitorAVisitGPU));     addElement(oComputer, createElement("HOF PRO M.2", visitorAVisitDisk));      struct Visitor *oVisitorA = createVisitor(visitorAVisitCPU, visitorAVisitGPU, visitorAVisitDisk);     struct Visitor *oVisitorB = createVisitor(visitorBVisitCPU, visitorBVisitGPU, visitorBVisitDisk);      acceptVisitor(oComputer, oVisitorA);     acceptVisitor(oComputer, oVisitorB);      clearComputer(oComputer);     free(oVisitorA);     free(oVisitorB);      return 0; }  

相关内容

热门资讯

推荐一下!青橙竞技卡五星辅助,... 推荐一下!青橙竞技卡五星辅助,新518互游脚本下载,好像是真的有挂(哔哩哔哩)青橙竞技卡五星辅助透视...
总结一下!老友广东麻将辅助,杭... 总结一下!老友广东麻将辅助,杭州都莱辅助,切实真的是有挂(哔哩哔哩)1、在老友广东麻将辅助插件功能辅...
解迷一下!创思维激k怎么开挂,... 解迷一下!创思维激k怎么开挂,创思维辅助软件,切实真的有挂(哔哩哔哩)1、创思维激k怎么开挂辅助器安...
辅助一下!微信微乐游戏辅助脚本... 辅助一下!微信微乐游戏辅助脚本,拱趴大菠萝有辅助吗,总是有挂(哔哩哔哩)辅助一下!微信微乐游戏辅助脚...
辅助一下!时光互娱房卡辅助,新... 辅助一下!时光互娱房卡辅助,新漫游免费辅助器,本来真的有挂(哔哩哔哩)1、让任何用户在无需时光互娱房...
关于一下!多乐跑得快私人房间作... 关于一下!多乐跑得快私人房间作弊视频,来来拼十辅助,都是真的有挂(哔哩哔哩)1、打开软件启动之后找到...
教你一下!卡五星游戏源码,决战... 教你一下!卡五星游戏源码,决战卡五星辅助器,其实是有挂(哔哩哔哩)1)决战卡五星辅助器辅助插件:进一...
普及一下!同乡游有辅助软件码,... 普及一下!同乡游有辅助软件码,老友广东辅助器,总是是有挂(哔哩哔哩)1、上手简单,内置详细流程视频教...
曝光一下!创思维激k有辅助器吗... 曝光一下!创思维激k有辅助器吗,hhpoker辅助是真的吗,好像存在有挂(哔哩哔哩)创思维激k有辅助...
总结一下!边锋干瞪眼小程序辅助... 总结一下!边锋干瞪眼小程序辅助,心悦踢辅助软件,真是存在有挂(哔哩哔哩)1、这是跨平台的边锋干瞪眼小...