每日博客

访问者模式

[实验任务一]:打包员

在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。

实验要求:

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. 注意编程规范。

 

 

posted @ 2023-09-26 09:13  秃头的小白  阅读(10)  评论(0编辑  收藏  举报