• 读书笔记:c++对话系列,Visitor模式


    需要在类体系中加入一个新的虚函数,但不允许改动。
    Visitor模式,核心是:将操作作为数据对象传递给类体系预留的Accept函数

    class Personnel{
    public:
      virtual void Pay () = 0;
      virtual void Promote() = 0;
      virtual void Accept(Visitor &) = 0;
    };
    class Officer : public Personnel { /* 改写虚拟函数 */ };
    class Captain : public Officer { /* 改写虚拟函数 */ };
    class First : public Officer { /* 改写虚拟函数 */ };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Visitor模式:行为型设计模式。允许为对象结构的元素添加进一步的操作,而不必修改这些元素的类。以下为示例:

    class Element {
    public:
        virtual ~Element() {}
        virtual void accept(class Visitor &v) = 0;
    };
    class ConcreteElementA : public Element {
    public:
        void accept(Visitor &v) override{v.visit(*this);}
        void operationA() {
            std::cout << "Element A operation." << std::endl;
        }
    };
    class ConcreteElementB : public Element {
    public:
        void accept(Visitor &v) override{v.visit(*this);}
        void operationB() {
            std::cout << "Element B operation." << std::endl;
        }
    };
    class Visitor {
    public:
        virtual ~Visitor() {}
        virtual void visit(ConcreteElementA &element) = 0;
        virtual void visit(ConcreteElementB &element) = 0;
    };
    class ConcreteVisitor : public Visitor {
    public:
        void visit(ConcreteElementA &element) override {
            element.operationA();
            std::cout << "Visited by ConcreteVisitor." << std::endl;
        }
        void visit(ConcreteElementB &element) override {
            element.operationB();
            std::cout << "Visited by ConcreteVisitor." << std::endl;
        }
    };
    class NewOperationVisitor : public Visitor { //这个就是新增的操作范例
    public:
        void visit(ConcreteElementA &element) override {
            std::cout << "New operation visited Element A." << std::endl;
        }
        void visit(ConcreteElementB &element) override {
            std::cout << "New operation visited Element B." << std::endl;
        }
    };
    int main() {
        ConcreteElementA elementA;
        ConcreteElementB elementB;
        ConcreteVisitor visitor;    //原操作
        elementA.accept(visitor);
        elementB.accept(visitor);
        NewOperationVisitor newOperationVisitor;//这个就是新增的操作范例
        elementA.accept(newOperationVisitor);
        elementB.accept(newOperationVisitor);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    以下为改写前面的代码

    class Visitor {
    public:
      virtual void Visit( Personnel& ) = 0;
      virtual void Visit( Officer& ) = 0;
      virtual void Visit( Captain& ) = 0;
      virtual void Visit( First& ) = 0;
    };
    void Personnel::Accept( Visitor & v ) { v.Visit( *this ); } 
    void Officer::Accept ( Visitor & v ) { v.Visit( *this ); } 
    void Captain::Accept ( Visitor & v ) { v.Visit( *this ); } 
    void First::Accept ( Visitor & v ) { v.Visit( *this ); } 
    class DoSomething : public Visitor {
    public:
      virtual void Visit( Personnel& );
      virtual void Visit( Officer& );
      virtual void Visit( Captain& );
      virtual void Visit( First& );
    };
    void DoSomething::Visit( Captain& c ){
      if( femaleGuestStarIsPresent )
        c.TurnOnCharm();
      else
        c.StartFight();
    }
    void DoSomething::Visit( First& f ){
      f.RaiseEyebrowAtCaptainsBehavior();
    }
    void f( Personnel& p ){
      p.Accept( DoSomething() );
    }
    int main(){
      Captain k;
      First s;
      f( k );
      f( s );
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    代码可读性,前置检查、注释及总结
    行为型模式-解释器模式
    【自学CSS笔记第10篇】——CSS浮动及清除浮动(此一篇足以)
    新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题开源全解密版
    机器学习笔记之线性分类——逻辑回归
    技术分享 | 使用 SQL 语句来简化 show engine innodb status 的结果解读
    计算机毕业设计之校园二手交易平台
    WindTerm:新一代开源免费的终端工具,GitHub星标6.6k+,太酷了!
    数据结构:队列
    第0讲 课程介绍
  • 原文地址:https://blog.csdn.net/weixin_43172531/article/details/134024380