[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; } 

相关内容

热门资讯

4分钟作弊辅助!wepoker... 4分钟作弊辅助!wepoker有什么规律(透视底牌)详细辅助功能(都是真的有挂)1、每一步都需要思考...
十分钟透视!wpk透视工作室,... 十分钟透视!wpk透视工作室,wpk是真的还是假的,详细教程(有挂功能)1、完成wpk透视工作室的残...
二分钟辅助挂下载!德扑HHpo... 二分钟辅助挂下载!德扑HHpoker有挂吗,hhpoker真能买到挂吗,详细教程(有挂方法)1、每一...
8分钟俱乐部!aapoker免... 8分钟俱乐部!aapoker免费透视脚本(透视脚本)详细辅助挂(一直是有挂)1、游戏颠覆性的策略玩法...
3分钟俱乐部辅助!wepoke... 3分钟俱乐部辅助!wepoker能不能透视,wepoker透视功能下载,详细教程(有挂规律);在进入...
二分钟软件!hhpoker有没... 二分钟软件!hhpoker有没有作弊辅助(透视脚本)详细辅助机器人(好像有挂);1、首先打开最新版本...
十分钟下载链接!wpk辅助软件... 十分钟下载链接!wpk辅助软件,如何判断wpk辅助软件的真假,详细教程(有挂安装)1、这是跨平台的w...
四分钟开辅助器!aapoker... 四分钟开辅助器!aapoker辅助插件工具(透视辅助)详细辅助作弊(一直存在有挂)aapoker辅助...
五分钟私人局规律!we-pok... 五分钟私人局规律!we-poker软件(透视底牌)详细辅助app(原来存在有挂);1、首先打开we-...
六分钟模拟器!HH平台挂,hh... 六分钟模拟器!HH平台挂,hhpoker必备开挂,详细教程(有挂辅助)1、六分钟模拟器!HH平台挂,...