• C++ 设计模式 —— 訪问者(Visitor)


    訪问者设计模式的实现借助于两个继承体系,

    • (1)elements:一个是被操作的类(基类及其子类)
    • (2)visitors:一个定义了一系列操作的訪问者(基类及其子类)

    訪问者模式是一种行为型设计模式(behavioral design pattern),被用于为一个树形结构(Node、LeafNode、InternalNode)中的 elements 添加操作。使用訪问者设计模式,我们不需在 elements 类内部编写相关成员函数实现功能,而是将操作定义在另外的一个类的继承体系中,也即 Visitors。(实现了一种分离?)



    class LeafNode;
    class InternalNode;
    
    class Visitor
    {
    public:
        virtual ~Visitor(){}
        virtual void visit(const LeafNode&)  = 0;
        virtual void visit(const InternalNode&)  = 0;
    };
    class PrintVisitor:public Visitor
    {
    public:
        void visit(const LeafNode&)
        {
            cout << "visiting a leafnode " << endl;
        }
        void visit(const InternalNode&)
        {
            cout << "visiting an internal node" << endl;
        }
    };
    
    class Node
    {
    public:
        virtual ~Node(){}
        virtual void accept(Visitor& v) = 0;
    };
    
    class LeafNode:public Node
    {
    public:
        void accept(Visitor& v)
        {
            v.visit(*this);
        }
    };
    
    class InternalNode :public Node
    {
    public:
        void accept(Visitor& v)
        {
            v.visit(*this);
            for (const auto& elem : _data)
                elem->accept(v);
        }
        void add(Node* pn)
        {
            _data.push_back(pn);
        }
    private:
        vector<Node*> _data;
    };

    client代码:

    LeafNode lna;
    LeafNode lnb;
    LeafNode lnc;
    InternalNode in1;
    InternalNode in2;
    in1.add(&lna);
    in1.add(&in2);
    in2.add(&lnb);
    in2.add(&lnc);
    PrintVisitor pv;
    in1.accept(pv);

    执行结果:

    visiting an internal node
    visiting a leafnode
    visiting an internal node
    visiting a leafnode
    visiting a leafnode
  • 相关阅读:
    node.js中的全局变量——global
    Element-UI库 源码架构浅析
    如何搭建一个自己cli
    webpack实践之DLLPlugin 和 DLLReferencePlugin
    HappyPack优化
    线程和进程
    kafka?kafaka! kafka...
    Dubbo的初步理解和使用
    Redis的安装和启动
    解析Spring MVC上传文件
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7344164.html
Copyright © 2020-2023  润新知