11.27实验 25:访问者模式

[实验任务一]:打包员

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

实验要求:

1. 画出对应的类图;

 

 

 

 

2. 提交源代码;

#include <iostream>

#include <string>

#include <list>

using namespace std;

 

class Product;

class Book;

class Apple;

 

class Visitor

{

protected:

string name;

public:

void SetName(string name) {

this->name = name;

}

virtual void Visit(Apple *apple) {};

virtual void Visit(Book *book) {};

};

 

 

class Product

{

public:

// Methods

virtual void Accept(Visitor *visitor) {};

};

 

 

// "ConcreteElement"

class Apple : public Product {

public:

 

void Accept(Visitor *visitor) {

visitor->Visit(this);

}

};

 

class Book :public Product {

public:

void Accept(Visitor* visitor) {

visitor->Visit(this);

}

};

 

class Customer : public Visitor {

public:

void Visit(Book *book) {

cout << "顾客" << name << "买书" << endl;

}

 

void Visit(Apple *apple) {

cout << "顾客" << name << "选苹果" << endl;

}

};

 

class Saler : public Visitor {

public:

void Visit(Book *book) {

cout << "收银员" << name << "直接计算书的价格" << endl;

}

 

void Visit(Apple *apple) {

cout << "收银员" << name << "给苹果过秤,然后计算其价格" << endl;

}

};

 

class Packer : public Visitor {

public:

void Visit(Book *book) {

cout << "打包员" << name << "给书打包" << endl;

}

 

void Visit(Apple *apple) {

cout << "打包员" << name << "给苹果打包" << endl;

}

};

 

 

// "ObjectStructure"

class BuyBasket

{

private:

list<Product*> products;

 

public:

 

void Attach(Product *product)

{

products.push_back(product);

}

 

void Detach(Product *product)

{

products.remove(product);

}

 

void Accept(Visitor *visitor)

{

for (std::list<Product*>::iterator it = products.begin(); it != products.end(); ++it)

(*it)->Accept(visitor);

}

};

 

int main()

{

BuyBasket *buybasket = new BuyBasket();

 

Product* apple = new Apple();

Product* book = new Book();

 

buybasket->Attach(apple);

buybasket->Attach(book);

 

Customer *customer = new Customer();

customer->SetName("张三");

Saler* saler = new Saler();

saler->SetName("李四");

Packer* packer = new Packer();

packer->SetName("王五");

 

// Employees are visited

cout << "----customer----" << endl;

buybasket->Accept(customer);

 

cout << "----saler----" << endl;

buybasket->Accept(saler);

 

cout << "----packer----" << endl;

buybasket->Accept(packer);

}

3. 注意编程规范。

 

 

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