Java/C++实现访问者模式---购物车

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

类图:

 

Java代码:

复制代码
public interface Product {
    void accept(Visitor visitor);
}

public class Apple implements Product{

    @Override
    public void accept(Visitor visitor) {
        // TODO Auto-generated method stub
        visitor.visit(this);
    }
    
}

public class Book implements Product{

    @Override
    public void accept(Visitor visitor) {
        // TODO Auto-generated method stub
        visitor.visit(this);
    }

}

public class BuyBasket {
    private ArrayList list=new ArrayList();
    
    public void accept(Visitor visitor) {
        Iterator i=list.iterator();
        
        while(i.hasNext()) {
            ((Product)i.next()).accept(visitor);
        }
    }
    public void addProduct(Product product) {
        list.add(product);
    }
    public void removeProduct(Product product) {
        list.remove(product);
    }
}

public class Customer extends Visitor{

    @Override
    public void visit(Apple apple) {
        // TODO Auto-generated method stub
        System.out.println("顾客"+name+"选苹果。");
    }

    @Override
    public void visit(Book book) {
        // TODO Auto-generated method stub
        System.out.println("顾客"+name+"买书。");
    }
    
}

public class Packer extends Visitor{

    @Override
    public void visit(Apple apple) {
        // TODO Auto-generated method stub
        System.out.println("打包员"+name+"给苹果打包。");
    }

    @Override
    public void visit(Book book) {
        // TODO Auto-generated method stub
        System.out.println("打包员"+name+"给书打包。");
    }

}

public class Saler extends Visitor{

    @Override
    public void visit(Apple apple) {
        // TODO Auto-generated method stub
        System.out.println("收银员"+name+"给苹果过秤,然后计算其价格");
    }

    @Override
    public void visit(Book book) {
        // TODO Auto-generated method stub
        System.out.println("收银员"+name+"直接计算书的价格。");
    }

}

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

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Product b1=new Book();
        Product b2=new Book();
        Product a1=new Apple();
        Visitor visitor;
        
        BuyBasket basket=new BuyBasket();
        basket.addProduct(b1);
        basket.addProduct(b2);
        basket.addProduct(a1);
        
        visitor=new Customer();
        visitor.setName("张三");
        basket.accept(visitor);
        System.out.println("----------------------------");
        visitor=new Packer();
        visitor.setName("李四");
        basket.accept(visitor);
        System.out.println("----------------------------");
        visitor=new Saler();
        visitor.setName("王五");
        basket.accept(visitor);
    }

}
复制代码

C++代码:

复制代码
#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Apple;
class Book;
class Visitor {
protected:
    string name;
public:
    void setName(string name) {
        this->name=name;
    }
    virtual void visit(Apple *apple)=0;
    virtual void visit(Book *book)=0;
};
class Customer :public Visitor{
public:
    void visit(Apple *apple) {
        cout<<"顾客"<<name<<"选苹果。"<<endl;
    }
    void visit(Book *book) {
        cout<<"顾客"<<name<<"买书。"<<endl;
    }
};
class Packer: public Visitor{
public:
    void visit(Apple *apple) {
        cout<<"打包员"<<name<<"给苹果打包。"<<endl;
    }
    void visit(Book *book) {
        cout<<"打包员"<<name<<"给书打包。"<<endl;
    }
};
class Saler:public Visitor{
public:
    void visit(Apple *apple) {
        cout<<"收银员"<<name<<"给苹果过秤,然后计算其价格"<<endl;
    }
    void visit(Book *book) {
        cout<<"收银员"<<name<<"直接计算书的价格。"<<endl;
    }
};
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:
    vector <Product *> products;
public:
    void accept(Visitor *visitor) {
        vector <Product *>::iterator iProduct = products.begin();
         while(iProduct != products.end())
         {
              (*iProduct)->accept(visitor);
              iProduct++;
         }
    }
    void addProduct(Product *product) {
        products.push_back(product);
    }
    void removeProduct(Product *product) {
        vector<Product*>::iterator product_rm = find(products.begin(), products.end(), product);
        products.erase(product_rm);
    }
};
int main(){
    // TODO Auto-generated method stub
    Product *b1=new Book();
    Product *b2=new Book();
    Product *a1=new Apple();
    Visitor *visitor;
    BuyBasket *basket=new BuyBasket();
    basket->addProduct(b1);
    basket->addProduct(b2);
    basket->addProduct(a1);

    visitor=new Customer();
    visitor->setName("张三");
    basket->accept(visitor);
    cout<<"----------------------------"<<endl;
    visitor=new Packer();
    visitor->setName("李四");
    basket->accept(visitor);
    cout<<"----------------------------"<<endl;
    visitor=new Saler();
    visitor->setName("王五");
    basket->accept(visitor);
}
复制代码

运行结果:

 

 

 

posted @   睡觉不困  阅读(125)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示