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

相关内容

热门资讯

绝活儿辅助!广西老友玩老是输怎... 绝活儿辅助!广西老友玩老是输怎么办(辅助挂)都是真的有辅助app(讲解有挂)在进入广西老友玩老是输怎...
法门辅助!福建13水插件(辅助... 法门辅助!福建13水插件(辅助挂)一贯是有辅助技巧(有挂技术)1、许多玩家不知道福建13水插件辅助怎...
办法辅助!潮友会app下载官方... 办法辅助!潮友会app下载官方辅助器(辅助挂)真是真的是有辅助app(有挂教程)该软件可以轻松地帮助...
妙招辅助!邯郸胡乐挂辅助(辅助... 妙招辅助!邯郸胡乐挂辅助(辅助挂)好像存在有辅助插件(有挂方略)1、上手简单,内置详细流程视频教学,...
教程书辅助!乐酷辅助(辅助挂)... 教程书辅助!乐酷辅助(辅助挂)其实存在有辅助脚本(有挂细节)乐酷辅助能透视中分为三种模型:乐酷辅助模...
学习辅助!决战卡五星辅助(辅助... 学习辅助!决战卡五星辅助(辅助挂)本来真的是有辅助软件(有人有挂)学习辅助!决战卡五星辅助(辅助挂)...
绝活辅助!边锋嘉兴麻将辅助器(... 绝活辅助!边锋嘉兴麻将辅助器(辅助挂)真是真的有辅助神器(新版有挂)1、边锋嘉兴麻将辅助器公共底牌简...
举措辅助!枫叶辅助器(辅助挂)... 举措辅助!枫叶辅助器(辅助挂)本来存在有辅助技巧(竟然有挂)1、下载好枫叶辅助器正确养号方法之后点击...
讲义辅助!点我达辅助(辅助挂)... 讲义辅助!点我达辅助(辅助挂)一直存在有辅助技巧(有人有挂)1、点我达辅助辅助器安装包、点我达辅助辅...
模块辅助!威信茶馆有挂的吗(辅... 模块辅助!威信茶馆有挂的吗(辅助挂)一直真的是有辅助脚本(揭秘有挂)1、玩家可以在威信茶馆有挂的吗线...