// 定义:表示一个作用于某个对象元素结构中的个元素操作,它使
// 你可以在不改变元素类的前提下定义作用于这些元素的新操作
//
// 模式举例:小酒楼有掌柜的,老板,老板娘,有收入账本和支出账本
// 不同人看同一账本由于权限不同看到的内容也不同
//
// 模式特点:
//
//
#include<iostream>
#include<string>
using namespace std;
class ZhangBen;
class ShouRuZhangBen;
class ZhiChuZhangBen;
class LingDao
{
public:
//感觉也可以不重载,只写一个最上层的,然后动态识别
virtual void visit(ZhangBen * z)=0;
virtual void visit(ShouRuZhangBen * z)=0;
virtual void visit(ZhiChuZhangBen * z)=0;
};
class ZhangBen
{
public:
virtual void accept(LingDao * l)=0;
};
class ShouRuZhangBen : public ZhangBen
{
public:
virtual void accept(LingDao * l)
{
l->visit(this);
}
void showAll()
{
cout <<"收入账本,查看全部"<<endl;
}
void showPart()
{
cout <<"收入账本,只能查看一部分"<<endl;
}
};
class ZhiChuZhangBen : public ZhangBen
{
public:
virtual void accept(LingDao * l)
{
l->visit(this);
}
void showAll()
{
cout <<"支出账本,查看全部"<<endl;
}
void showPart()
{
cout <<"支出账本,只能查看一部分"<<endl;
}
};
class ZhangGui : public LingDao
{
public:
virtual void visit(ZhangBen * z)
{
}
virtual void visit(ShouRuZhangBen * z)
{
cout<<"掌柜来访,";
z->showPart();
}
virtual void visit(ZhiChuZhangBen * z)
{
cout<<"掌柜来访,";
z->showPart();
}
};
class LaoBan : public LingDao
{
public:
virtual void visit(ZhangBen * z)
{
}
virtual void visit(ShouRuZhangBen * z)
{
cout<<"老板来访,";
z->showAll();
}
virtual void visit(ZhiChuZhangBen * z)
{
cout<<"老板来访,";
z->showAll();
}
};
int main()
{
LaoBan * pLaoBan = new LaoBan();
ZhangGui * pZhangGui = new ZhangGui();
ShouRuZhangBen * pShouRuZhangBen = new ShouRuZhangBen();
//最后采用accept的方式调用
pShouRuZhangBen->accept(pLaoBan);
pShouRuZhangBen->accept(pZhangGui);
return 0;
}