zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    MSDN2010安装及使用(MSDN Library)[转]
    单元测试那些事
    Nhibernate Profiler安装中的问题
    ztree的动态添加
    事件与委托
    linux ls dir
    学习技术资料的思路
    linux目录结构
    是否需要深入了解java平台
    工作中心的改变
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7344164.html
Copyright © 2011-2022 走看看