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); }
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!