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 ...
随机推荐
- JZ-031-从 1 到 n 整数中 1 出现的次数
从 1 到 n 整数中 1 出现的次数 题目描述 求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此 ...
- 如何使用 VS Code 远程连接矩池云主机
Visual Studio Code(以下简称 VS Code)是一个由微软开发的代码编辑器.VS Code 支持代码补全.代码片段.代码重构.Git 版本控制等功能. VS Code 现已支持连接远 ...
- linux作业--第三周
1.统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来 [root@localhost ~]# cat /etc/passwd | grep ...
- 分布式session的几种解决方案
现在很多商城,都会要求用户先去登录,登录之后再往购物车中添加商品,这样用户.购物车.商品,三个对象之间就有了绑定关系. 而针对我最开始说的那种情况,其实就是基于session做的,客户端往购物车中添加 ...
- OpenCv基础_四
Harris角点检测 理解 内部点:蓝框所示,无论滑动窗口水平滑动还是竖直滑动,框内像素值都不会发生大的变化 边界点:黑框所示,滑动窗口沿着某一个方向滑动框内像素点不会发生大的改变,但是沿着另一个方向 ...
- 磁盘管理--如何在VMware上给centos7增加一块磁盘
一. 实验环境 VMware Workstaion + Centos7 二.实验步骤 1.关闭虚拟机,添加磁盘 2.添加硬件向导 硬件类型 你要安装哪类硬件? 点击完成观察到已经成功添加磁盘 3.开启 ...
- python 命令行参数学习(一)
用了这么久,还没怎么学习python的命令行参数,是在惭愧. 参考文章地址:http://www.cnblogs.com/jianboqi/archive/2013/01/10/2854726.htm ...
- 论php常见的问题[转载自原乌云]
论PHP常见的漏洞 ′ 雨. · 2015/01/14 10:08 0x00 前言 里面很多都是像laterain学习到的, 如果能考上cuit的话 自动献菊花了. 0x01 安装的问题 首先拿到一份 ...
- J20航模遥控器开源项目系列教程(四)PCB打印 | 嘉立创PCB下单教程,5元顺丰包邮解君愁!
我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/J ...
- 题解0004:单词接龙(洛谷P1019)
题目描述:已知一组单词,给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙"中出现两次),在两个单词相连时,其重合部分合为一部分. 题 ...