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

相关内容

热门资讯

透视苹果版!pokerworl... 透视苹果版!pokerworld破解版下载,哈糖大菠萝破解器,举措教程(真的有挂)-哔哩哔哩poke...
透视ai代打!poker wo... 透视ai代打!poker world辅助器(透视)好像存在有挂,可靠教程(有挂插件挂)-哔哩哔哩一、...
八分钟揭露!wepoker怎么... 八分钟揭露!wepoker怎么挂飞机(透视)确实真的是有挂,AI教程(有挂实锤)-哔哩哔哩1、八分钟...
透视辅助!如何下载wepoke... 透视辅助!如何下载wepoker安装包,有没有人wepoker,举措教程(确实有挂)-哔哩哔哩如何下...
透视透视!拱趴大菠萝机器人(透... 透视透视!拱趴大菠萝机器人(透视)其实真的有挂,AI教程(有挂技巧)-哔哩哔哩1、拱趴大菠萝机器人透...
第5分钟详细!wepoker私... 第5分钟详细!wepoker私人定制透视(透视)竟然是有挂,必备教程(存在有挂)-哔哩哔哩1、点击下...
透视透视!wpk私人局辅助是真... 透视透视!wpk私人局辅助是真的吗,德普之星私人局辅助免费,方案教程(有人有挂)-哔哩哔哩1、德普之...
透视系统!werplan怎么辅... 透视系统!werplan怎么辅助(透视)切实是真的挂,详细教程(有挂脚本)-哔哩哔哩1、玩家可以在w...
一分钟普及!wepoker轻量... 一分钟普及!wepoker轻量版透视(透视)总是真的有挂,解密教程(真实有挂)-哔哩哔哩;1、游戏颠...
透视挂透视!we poker插... 透视挂透视!we poker插件,aapoker真的假的,策略教程(有挂助手)-哔哩哔哩1、aapo...