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

相关内容

热门资讯

第二分钟辅助!hhpoker辅... 第二分钟辅助!hhpoker辅助软件是真的么,wepoker有辅助吗(透视)分享教程(有挂方法)暗藏...
玩家必看科普!aa poker... 玩家必看科普!aa poker下载地址,aa扑克有外挂,详细教程(了解有挂)-哔哩哔哩;aa pok...
6分钟黑科技!wepoker安... 6分钟黑科技!wepoker安装教程,aapoker透视脚本下载(透视)AI教程(有挂分析)aapo...
一分钟揭秘!wpk德州透视辅助... 一分钟揭秘!wpk德州透视辅助,微扑克辅助器ios,微扑克教程(有挂方针)-哔哩哔哩,wpk德州透视...
第二分钟普及!wpk透视挂,h... 第二分钟普及!wpk透视挂,hhpoker脚本下载(透视)系统教程(有挂教程)1、hhpoker脚本...
黑科技科技!aa扑克平台的机制... 黑科技科技!aa扑克平台的机制,wepoke透明挂咋测试,玩家教程(竟然有挂)-哔哩哔哩;一、wep...
第7分钟领会!wepoker模... 第7分钟领会!wepoker模拟器哪个,拱趴大菠萝万能挂图解(透视)必胜教程(讲解有挂)1、金币登录...
一分钟教会你!wepoke透明... 一分钟教会你!wepoke透明挂在哪买,wpk有平衡机制,技巧教程(有人有挂)-哔哩哔哩;wepok...
第三分钟普及!wepoker脚... 第三分钟普及!wepoker脚本,wepoker提高好牌率(透视)2025版教程(有挂规律)1、we...
重大消息!wpk微扑克最新辅助... 重大消息!wpk微扑克最新辅助,wpk输赢机制,攻略教程(果真有挂)-哔哩哔哩;wpk微扑克最新辅助...