[C++][设计模式][访问器]详细讲解
创始人
2024-11-21 16:08:43
0

目录

  • 1.动机
  • 2.模式定义
  • 3.要点总结
  • 4.代码感受
    • 1.代码一
    • 2.代码二


1.动机

  • 在软件构件过程中,由于需求的变化,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改, 将会给子类带来很繁重的变更负担,甚至破坏原有设计
  • 如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上面的问题?

2.模式定义

  • 定义:表示一个作用与某对象结构中的各元素的操作
  • 功能:使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)
  • 结构
    请添加图片描述

3.要点总结

  • Visitor模式通过所谓的双重分发(double dispatch)来实现在不更改(编译时)Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作(支持变化)
  • 所谓双重分发Visitor模式中间包括了两个多态分发
    • 第一个为accept方法的多态辨析
    • 第二个为visitElement方法的多态辨析
  • Visitor模式的最大缺点在于扩展类层次结构(添加新的Element子类),会导致Visitor类的改变
    • 因此Visitor模式适用于“Element类层次结构稳定,而其中的操作却经常面临频繁改动”

4.代码感受

1.代码一

class Visitor;  class Element { public:     virtual void Func1() = 0;     virtual void Func2(int data) = 0;     virtual void Func3(int data) = 0;     //...          virtual ~Element(){} };  class ElementA : public Element { public:     void Func1() override     {}          void Func2(int data) override     {} };  class ElementB : public Element { public:     void Func1() override     {}          void Func2(int data) override      {} }; 

2.代码二

class Visitor;  class Element { public:     virtual void accept(Visitor& visitor) = 0; // 第一次多态辨析      virtual ~Element(){} };  class ElementA : public Element { public:     void accept(Visitor& visitor) override      {         visitor.visitElementA(*this);     } };  class ElementB : public Element { public:     void accept(Visitor& visitor) override      {         visitor.visitElementB(*this); // 第二次多态辨析     } };  class Visitor { public:     virtual void visitElementA(ElementA& element) = 0;     virtual void visitElementB(ElementB& element) = 0;          virtual ~Visitor(){} };  //========================================================= //扩展1 class Visitor1 : public Visitor { public:     void visitElementA(ElementA& element) override     {         cout << "Visitor1 is processing ElementA" << endl;     }              void visitElementB(ElementB& element) override     {         cout << "Visitor1 is processing ElementB" << endl;     } };       //扩展2 class Visitor2 : public Visitor { public:     void visitElementA(ElementA& element) override     {         cout << "Visitor2 is processing ElementA" << endl;     }          void visitElementB(ElementB& element) override     {         cout << "Visitor2 is processing ElementB" << endl;     } };          int main() {     Visitor2 visitor;      // 这里应该用一个基类指针接收     ElementB elementB;     elementB.accept(visitor); // double dispatch          ElementA elementA;     elementA.accept(visitor);          return 0; } 

相关内容

热门资讯

突发!hhpoker透视脚本下... 突发!hhpoker透视脚本下载,德普之星透视辅助软件下载,一贯是真的有挂(有挂教学)德普之星透视辅...
代打辅助挂!wpk俱乐部是做什... 代打辅助挂!wpk俱乐部是做什么的,德普软件,一直存在有挂(有挂神器)德普软件辅助器是一种具有地方特...
2026版教学!pokemmo... 2026版教学!pokemmo辅助器手机版下载,德普之星透视辅助,切实是有挂(有挂详细)1、该软件可...
教程辅助挂!wepoker插件... 教程辅助挂!wepoker插件辅助,德普之星私人局辅助器,果然真的有挂(今日头条)1、玩家可以在德普...
一直以来!cloudpoker... 一直以来!cloudpoker外挂,德扑之星透视软件免费入口官网,本来是真的有挂(竟然有挂)1、德扑...
做出回应!wepoker游戏安... 做出回应!wepoker游戏安装教程,智星菠萝透视,竟然存在有挂(的确有挂)亲,关键说明,智星菠萝透...
今日!wepoker免费辅助器... 今日!wepoker免费辅助器,德普之星app安卓版破解版,确实是有挂(有挂细节)1、很好的工具软件...
总结辅助挂!德普之星辅助工具如... 总结辅助挂!德普之星辅助工具如何打开,德扑之星怎么开辅助,一直真的有挂(证实有挂)1、下载好德普之星...
黑科技插件!hhpoker透视... 黑科技插件!hhpoker透视方法,德扑圈有透视吗,真是存在有挂(有挂总结)1、下载好德扑圈有透视吗...
第三方插件!wejoker辅助... 第三方插件!wejoker辅助软件,智星菠萝辅助,一直是真的有挂(有挂解密)1、全新机制【智星菠萝辅...