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);
}
运行结果:


Java/C++实现访问者模式---购物车的更多相关文章
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
- JAVA设计模式之访问者模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要 ...
- Java实现在访问者模式中使用反射
集合类型在面向对象编程中很常用,这也带来一些代码相关的问题.比如,“怎么操作集合中不同类型的对象?” 一种做法就是遍历集合中的每个元素,然后根据它的类型而做具体的操作.这会很复杂,尤其当你不知道集合中 ...
- 15.java设计模式之访问者模式
基本需求: 电脑需要键盘鼠标等固定的组件组成 现在分为个人,组织等去买电脑,而同一种组件对不同的人(访问者)做出不同的折扣,从而电脑的价格也不一样 传统的解决方法:在组件内部进行判断访问人的类型,从而 ...
- 由电脑专卖系统引发的Java设计模式:访问者模式
目录 定义 意图 解决问题 何时使用 优缺点 结构 电脑专卖系统 定义 访问者模式是对象的行为型模式,它的目的是封装一些施加于某些数据结构元素之上的操作,一旦这些操作需要修改的话,接收这个操作的数据结 ...
- JAVA 设计模式 访问者模式
用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途
- java设计模式---访问者模式
Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自 己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自 ...
- Java进阶篇设计模式之十 ---- 访问者模式和中介者模式
前言 在上一篇中我们学习了行为型模式的解释器模式(Interpreter Pattern)和迭代器模式(Iterator Pattern).本篇则来学习下行为型模式的两个模式,访问者模式(Visito ...
- Java设计模式之十 ---- 访问者模式和中介者模式
前言 2018年已经过去,新的一年工作已经开始,继续总结和学习Java设计模式. 在上一篇中我们学习了行为型模式的解释器模式(Interpreter Pattern)和迭代器模式(Iterator P ...
随机推荐
- Phoenix使用
目录 Phoenix连接 Phoenix常用命令 表映射 视图映射 表映射 Phoenix二级索引 开启索引支持 全局索引 创建索引后 创建多条件索引后 本地索引 覆盖索引 总结 Phoenix JD ...
- C# ProgressBar的简单使用
ProgressBar控件(进度条)用于在win窗体中显示进度,由于它的值会不断更新,为了不让界面假死,一般都是采用多线程的方式对进度条进行管理.有关ProgressBar的理论基础跟详细知识我在这里 ...
- tp5 webupload文件上传至七牛云
1:composer安装: composer require qiniu/php-sdk 2: 配置使用: 在tp5.1的配置文件app.php中配置七牛云的参数 'qiniu' => [ 'a ...
- think php 登录 (session+验证码)
..........表单页面 <!DOCTYPE html> {__NOLAYOUT__} <html lang="en"> <head> &l ...
- nginx 配置 https,及加载配置文件夹
首先需要去申请一个域名签名证书,在腾讯云,阿里云都有免费版,然后下载下来按如下配置,请根据自己路径更改 server { listen 80; server_name xxx.xxx.cn; root ...
- nginx 访问php文件报错
问题图: An error occurred. 解决方法(windows版) php.cgi没有启动 cmd中找到cig.exe 的位置然后运行 php-cgi.exe -b 127.0.0.1: ...
- 『现学现忘』Docker基础 — 23、使用Docker安装Tomcat
目录 步骤1:搜索镜像 步骤2:下载Tomcat镜像 步骤3:运行Tomcat镜像 步骤4:本机和外网测试 步骤5:解决问题 补充:--rm选项 步骤1:搜索镜像 使用docker search命令进 ...
- 实践2:github管理代码仓库,包含用webpack打包项目
此篇介绍用github仓库管理代码,github是大型的项目代码管理,存储平台:简单说帮助一个团队共享,修改同一个项目,配合着gitHub Desktop非常方便: 可以做到多人删除.修改.增加同一项 ...
- Linux下查看端口占用进程号,程序名的方法
Linux下查看端口占用进程号,程序名的方法,方便我们查找什么进程导致系统变慢等需要.linux下查看端口占用情况: 1. 查看哪个进程占用了819端口: case9-sghfofo:/usr/loc ...
- python3求200以内能被17整除的最大正整数
for i in range(200, 17,-1): if(i%17==0): print(i) break