访问者模式之C++实现

来源:互联网 发布:质量数据分析管理办法 编辑:程序博客网 时间:2024/06/18 15:19

看了Java实现的访问者模式,将其用C++重新实现,比较,可知为什么设计模式在Java中更加简单,这也就是为什么几乎所有关于设计模式的书都是Java实现。因为资源自动化管理可以更加突出重点。还有,C++的细节太多了,稍不小心就出问题,比如基类里要带一个虚的析构函数,还得有实现体,如果照抄Java的,惨了,资源泄漏,具体可参加 effective C++:




// app.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <boost/bind.hpp>#include <iostream>#include <list>#include <algorithm>using namespace std;class Apple;class Book;class visitor{public:    virtual void visit (Apple* apple) = 0;    virtual void visit (Book* book) = 0;    virtual ~visitor ( ) {};};class Product{public:    virtual void accept (visitor* v) = 0;    virtual ~Product ( ) {}};class Apple : public Product{    // Inherited via Product    virtual void accept (visitor * v) override    {        v->visit (this);    }    ~Apple()    {        std::cout << "~Apple()" << std::endl;    }};class Book : public Product{    // Inherited via Product    virtual void accept (visitor * v) override    {        v->visit (this);    }};class customer : public visitor{    // Inherited via visitor    virtual void visit (Apple * apple) override    {        std::cout << "客户买苹果" << std::endl;    }    virtual void visit (Book * book) override    {        std::cout << "客户买书" << std::endl;    }};class sale : public visitor{    // Inherited via visitor    virtual void visit (Apple * apple) override    {        std::cout << "销售卖苹果" << std::endl;    }    virtual void visit (Book * book) override    {        std::cout << "销售卖书" << std::endl;    }};class prodectList{    typedef std::list<Product*> container;    container m_list;public:    void add(Product* p)    {        m_list.push_back (p);    }    void remove(Product* p)    {        m_list.remove (p);    }    void visit(visitor* v)    {        container::iterator it = m_list.begin ( );        for (; it != m_list.end ( ); ++it)            (*it)->accept (v);    }    void free(Product* p)    {        if(p) delete p;    }    ~prodectList()    {        std::for_each (m_list.begin ( ), m_list.end ( ),boost::bind(&prodectList::free,this,_1));    }};int main(int argc, char* argv[]){    customer cu;    sale sa;    prodectList list;    list.add (new Apple);    list.add (new Apple);    list.add (new Book);    list.visit (&cu);    std::cout << std::endl;    list.visit (&sa);return 0;}






0 0
原创粉丝点击