首页 > 编程语言 >访问者模式javac++

访问者模式javac++

时间:2022-12-23 17:22:05浏览次数:41  
标签:java int visitor void c++ accept Visitor public 访问者

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

 

实验 25:访问者模式

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

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

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

 

[实验任务一]:打包员

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

实验要求:

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

 

 

 

 

2. 注意编程规范。

 

 

 

package test25;

public abstract class AbstractGoods implements Goods{

    private String name;

    private int num;

    private int price;

    public AbstractGoods(String name, int num,int price) {

        this.name = name;

        this.num = num;

        this.price = price;

    }

    @Override

    public abstract int accept(Visitor visitor);

    public String getName() {

        return name;

    }

    public int getNum() {

        return num;

    }

    public int getPrice() {

        return price;

    }

}
package test25;

public class Book extends AbstractGoods {



    public Book(String name, int num, int price) {

        super(name, num, price);

    }

    @Override

    public int accept(Visitor visitor) {

        return visitor.visit(this);

    }

}
package test25;

public class Client {

    public static void main(String[] args) {

        Shoppingcar shoppingCar = new Shoppingcar();

        shoppingCar.add(new Book("西游记", 2, 25));

        shoppingCar.add(new Book("活着", 2, 30));

        shoppingCar.add(new Fruit("苹果", 2, 5));

        shoppingCar.add(new Fruit("火龙果", 6, 8));

        shoppingCar.getCosts();

    }

}
package test25;

public class Fruit extends AbstractGoods {

    public Fruit(String name, int num, int price) {

        super(name, num, price);

    }

    @Override

    public int accept(Visitor visitor) {

        return visitor.visit(this);

    }

}
package test25;

public interface Goods {

    public int accept(Visitor visitor);

    public String getName();

    public int getNum();

    public int getPrice();

}
package test25;

import java.util.ArrayList;
import java.util.List;

public class Shoppingcar {
    private static final List<Goods> goods = new ArrayList<>();
    private static final Visitor visitor = new shouyinyuan();
    public void add(Goods g) {
        goods.add(g);
    }
    public void remove(Goods g) {
        goods.remove(g);
    }
    public int getCosts() {
        int sum = 0;
        int i = 1;
        for (Goods g : goods) {
            int c = g.accept(visitor);
            System.out.println(g.getName() + ":" + c + "元");
            sum = sum + c;
        }
        System.out.println("一共是:" + sum + " 元");
        return sum;
    }
}
package test25;

public class shouyinyuan implements Visitor {

    @Override

    public int visit(Book book) {

        int cost = book.getNum() * book.getPrice();

        return cost;

    }

    @Override

    public int visit(Fruit fruit) {

        int cost = fruit.getNum() * fruit.getPrice();

        return cost;

    }

}
package test25;

public interface  Visitor {

    int visit(Book book) ;

    int visit(Fruit fruit);

}
#include<iostream>
#include <list>
using namespace std;
class Apple;
class Book;
//抽象访问者
class Visitor
{
protected:
    string name;
public:
    void setName(string name)
    {
        this->name = name;
    }
    string getname() {
        return name;
    }
    virtual void visit(Apple *apple)=0;
    virtual void visit(Book *book)=0;
};
//抽象元素
class Product
{
public:
    virtual void accept(Visitor *visitor)=0;
};
//具体元素
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 BuyBasket
{
private:
    list< Product*> product;
public:
    void accept(Visitor* visitor)
    {
        for (std::list<Product*>::iterator it = product.begin(); it != product.end(); ++it)
            (*it)->accept(visitor);
    }
    void addProduct(Product* product2)
    {
        product.push_back(product2);

    }
    void removeProduct(Product* product2)
    {
        product.remove(product2);
    }
};
class Saler :public Visitor
{
public:
    void visit(Apple *apple)
    {
        cout << "收银员" <<name.c_str() << "给苹果过秤,然后计算其价格。" << endl;
    }
    void visit(Book *book)
    {
        cout << "收银员" << name.c_str() << "直接计算书的价格。" << endl;
    }
};
class Customer :public Visitor
{
public:
    void visit(Apple *apple)
    {
        cout << "顾客" << name.c_str() << "选苹果。" << endl;
    }

    void visit(Book *book)
    {
        cout << "顾客" << name.c_str() << "买书。" << endl;
    }
};
class Pack {
private:
    list< Product*> product;
public:
    void accept(Visitor* visitor)
    {
        for (std::list<Product*>::iterator it = product.begin(); it != product.end(); ++it)
            (*it)->accept(visitor);

    }
    void addProduct(Product* product2)
    {
        product.push_back(product2);

    }
    void removeProduct(Product* product2)
    {
        product.remove(product2);
    }
};

class Packer :public Visitor {
public:
    void visit(Apple *apple) {

        cout << "打包员" << name.c_str() << "给购物车中的苹果进行打包。" << endl;
    }
    void visit(Book *book) {
        cout << "打包员" << name.c_str() << "给购物车中的书本进行打包。" << endl;
    }
};
int  main()
{
    Product *b1 = new Book();
    Product *a1 = new Apple();
    Visitor* visitor1 = new Customer();
    Visitor* visitor2 = new Packer();
    Visitor* visitor3 = new Saler();

    BuyBasket *basket = new BuyBasket();
    basket->addProduct(b1);
    basket->addProduct(a1);

    visitor1->setName("小龚");
    visitor2->setName("小张");
    visitor3->setName("小橘");


    basket->accept(visitor1);
    basket->accept(visitor3);
    basket->accept(visitor2);

    delete a1, b1,visitor1, visitor2, visitor3;
    return 0;
}

 

 

标签:java,int,visitor,void,c++,accept,Visitor,public,访问者
From: https://www.cnblogs.com/rongzhang/p/17001157.html

相关文章

  • 职责链模式javac++
    软件设计                 石家庄铁道大学信息学院 实验15:职责链模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解职责链模式......
  • 命令模式javac++
    软件设计                 石家庄铁道大学信息学院 实验16:命令模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解命令模式的动......
  • 中介者模式javac++
    软件设计                 石家庄铁道大学信息学院 实验19:中介者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解中介者模式......
  • 备忘录模式javac++
    软件设计                 石家庄铁道大学信息学院 实验 20:备忘录模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解备忘录模......
  • Java中线程的6种状态详解
    java.lang.Thread.State枚举类中定义了六种线程的状态,可以调用线程Thread中的getState()方法获取当前线程的状态。publicenumState{NEW,RUNNABLE,......
  • 代理模式javac++
    软件设计                 石家庄铁道大学信息学院 实验14:代理模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解代理模式的动......
  • 15_Java筑基之Object类、多态
    15_Java筑基之Object类、多态一.Object类Object类是类层次结构的根类,每个类都使用Object作为超类(父类).1.equals()方法指示其他某个对象是否与此对象“相等”.示例代码;......
  • C++ 获取特定进程的CPU使用率
    近来发现笔记本在关闭屏幕后风扇转得特别快,打开屏幕后看任务管理器,风扇马上减速,也没有发现大量占用CPU的进程。于是想写一个小程序在后台记录每个进程的CPU使用情况,揪出锁......
  • 装饰模式javac++
    实验11:装饰模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解装饰模式的动机,掌握该模式的结构;2、能够利用装饰模式解决实际问题。 [实验任务一]:手......
  • Java学习笔记7
    1.API​ API(ApplicationProgrammingInterface):应用程序接口。Java中的API:​ 指的是JDK中提供的各种功能的Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是......