实验 25:访问者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解访问者模式的动机,掌握该模式的结构;
2、能够利用访问者模式法解决实际问题。
[实验任务一]:打包员
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
实验要求:
1. 提交源代码,不要提交类图;
JAVA
package com.gazikel;
public interface Product {
void
accept(Visitor visitor);
}
package com.gazikel;
public class Apple implements Product {
@Override
public void
accept(Visitor visitor) {
visitor.visit(this);
}
}
package com.gazikel;
public class Book implements Product {
@Override
public void
accept(Visitor visitor) {
visitor.visit(this);
}
}
package com.gazikel;
public abstract class Visitor {
protected String
name;
public void
setName(String name) {
this.name =
name;
}
public abstract
void visit(Apple apple);
public abstract
void visit(Book book);
}
package com.gazikel;
public class Customer extends Visitor {
@Override
public void
visit(Apple apple) {
System.out.println("顾客" + name + "选苹果");
}
@Override
public void
visit(Book book) {
System.out.println("顾客" + name + "买书");
}
}
package com.gazikel;
public class Packer extends Visitor {
@Override
public void
visit(Apple apple) {
System.out.println("打包员" + name + "给苹果打包");
}
@Override
public void
visit(Book book) {
System.out.println("打包员" + name + "给书打包");
}
}
package com.gazikel;
public class Saler extends Visitor {
@Override
public void
visit(Apple apple) {
System.out.println("收银员" + name + "给苹果过秤,然后计算其价格");
}
@Override
public void
visit(Book book) {
System.out.println("收银员" + name + "直接计算书的价格");
}
}
package com.gazikel;
import java.util.ArrayList;
import java.util.List;
public class BuyBasket {
private List<Product> products = new
ArrayList();
public void
accept(Visitor visitor) {
for (Product
product : products) {
product.accept(visitor);
}
}
public void
addProduct(Product p) {
products.add(p);
}
public void
removeProduct(Product p) {
products.remove(p);
}
}
package com.gazikel;
public class Client {
public static
void main(String[] args) {
BuyBasket
buyBasket = new BuyBasket();
buyBasket.addProduct(new Apple());
buyBasket.addProduct(new Book());
Visitor saler
= new Saler();
saler.setName("张三");
System.out.println("----收银员----");
buyBasket.accept(saler);
Visitor
packer = new Packer();
packer.setName("李四");
System.out.println("----打包员----");
buyBasket.accept(packer);
Visitor
customer = new Customer();
customer.setName("王五");
System.out.println("----顾客----");
buyBasket.accept(customer);
}
}
C++
#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);
}
运行结果:
2. 注意编程规范。