实验 25:访问者模式

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

posted @ 2022-11-21 10:42  萧贾jzm  阅读(71)  评论(0编辑  收藏  举报
//歌单id