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
  • 相关阅读:
    Android大牛
    在学习oauth时学到的
    using-jade-and-grunt-to-speed-up-html-production
    build-your-microservices-api-with-swagger
    json-web-token-apache-shiro
    WebSocket对象特性和方法
    芝麻教程
    how to export multiple SVG graphics in illustrator
    直播后台
    关于在chrome中响应不出现在XHR里的远影
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7344164.html
Copyright © 2011-2022 走看看