访问者模式(大话设计模式)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; }  

相关内容

热门资讯

透视真的!青龙辅助器,soho... 透视真的!青龙辅助器,sohoo poker辅助,2026版教程(有挂开挂辅助工具)1、下载安装好s...
一分钟了解!微乐小程序辅助脚本... 一分钟了解!微乐小程序辅助脚本平台,杭州边锋辅助软件(有挂开挂辅助神器)1、下载安装好微乐小程序辅助...
9小时掌握!情怀国粹辅助,欢乐... 9小时掌握!情怀国粹辅助,欢乐达人正版脚本(有挂开挂辅助工具);无需打开直接搜索加薇13670430...
每日必看教程!斗棋bug,金华... >>您好:佛手在线辅助确实是有挂的,很多玩家在这款佛手在线辅助游戏中打牌都会发现很多用户的牌特别好,...
透视苹果版!新畅游互娱辅助ap... 哈糖大菠萝万能挂是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,有需要的用户可以加我微...
四分钟体悟!优优乐暗宝源码,小... 您好:小程序微乐游戏辅助这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的...
每日必备!多乐游戏辅助脚本下载... 每日必备!多乐游戏辅助脚本下载,随意玩辅助器下载(有挂开挂辅助下载);亲,多乐游戏辅助脚本下载这款游...
透明讲解!德普之星私人局辅助器... 大家好,今天小编来为大家解答德普之星私人局辅助器这个问题咨询软件客服可以免费测试直接加微信(1367...
2分钟熟悉!福建天天开心教程,... 2分钟熟悉!福建天天开心教程,哈局13张辅助器(有挂开挂辅助下载);打开点击测试直接进入微信(136...
最新通报!余干中至五十k有挂装... 最新通报!余干中至五十k有挂装吗,浙江游戏大厅脚本修改(有挂开挂辅助挂);无需打开直接搜索加薇136...