12.2

软件设计                  石家庄铁道大学信息学院

 

实验 25:访问者模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解访问者模式的动机,掌握该模式的结构;

2、能够利用访问者模式法解决实际问题。

 

[实验任务一]:打包员

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

实验要求:

1. 提交源代码,不要提交类图;

2. 注意编程规范。

 

 

 

#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);

}

 

 

posted @   秋渡晚枫  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示