看了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;
}