每日博客
访问者模式
[实验任务一]:打包员
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
实验要求:
1. 提交源代码,不要提交类图;
#include <iostream>
#include <vector>
using namespace std;
class Visitor;
class Product
{
public:
virtual void accept()=0;
};
class Book:public Product
{
public:
void accept()
{
cout<<"书";
}
};
class Apple:public Product
{
public:
void accept()
{
cout<<"苹果";
}
};
class Visitor
{
public:
string name;
void setName(string nam)
{
name=nam;
}
virtual void visit(Product* pro)=0;
};
class Saler:public Visitor
{
public:
void visit(Product* pro)
{
cout<<"收银员"<<name<<"给";
pro->accept();
cout<<"过秤,然后计算其价格。"<<endl;
}
};
class Customer:public Visitor
{
public:
void visit(Product* pro)
{
cout<<"顾客"<<name<<"买";
pro->accept();
cout<<endl;
}
};
class Packagor:public Visitor
{
public:
void visit(Product* pro)
{
cout<<"打包员"<<name<<"将";
pro->accept();
cout<<"打包。"<<endl;
}
};
class BuyBasket
{
private:
vector<Product*> list;
public:
void accept(Visitor* visitor)
{
for(int i=0;i<list.size();i++)
{
visitor->visit(list[i]);
}
}
void addProduct(Product* product)
{
list.push_back(product);
}
};
int main()
{
Product* b1=new Book();
Product* b2=new Book();
Product* a1=new Apple();
Visitor* visitor,* visitor1;
BuyBasket* basket=new BuyBasket();
visitor=new Saler();
visitor1=new Packagor();
basket->addProduct(b1);
basket->addProduct(b2);
basket->addProduct(a1);
visitor->setName("张三");
visitor1->setName("李四");
basket->accept(visitor);
basket->accept(visitor1);
}
2. 注意编程规范。