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 ...
随机推荐
- LeetCode-079-单词搜索
单词搜索 题目描述:给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过 ...
- 目标检测常用库MMCV安装中遇到的问题总结
我看很多教程说mmcv是只支持linux,支持windows版本较少,所以很难和torch.cuda匹配上,所以报错较多难安装.今天试了一下,遇到的和想到的报错问题基本如下: 一.首先是Microso ...
- nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
问题场景 服务器重启后,重启nginx时报错nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: N ...
- 配置DHCP Relay的功能原理是什么?
DHCP中继代理,就是在DHCP服务器和客户端之间转发DHCP数据包.当DHCP客户端与服务器不在同一个子网上,就必须有DHCP中继代理来转发DHCP请求和应答消息.DHCP中继代理的数据转发,与通常 ...
- 使用pyautogui自动在某网站投票的脚本
网页自动投票: # !/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan import re import pypercli ...
- 6月15日 python学习总结 Django模板语言相关内容
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
- dfs:x+y=z
#include <iostream.h> int a[100]; static int stat=0; void dfs(int n) { if(n==3) { if(a[0]+a[1] ...
- java常见面试问题总结
JDK1.7 并发的HashMap为什么会引起死循环? hashmap如何解决hash冲突,为什么hashmap中的链表需要转成红黑树? hashmap什么时候会触发扩容? jdk1.8之前并发操作h ...
- 什么是springboot?为什么要用springboot?
一.什么是springboot? Springboot是spring发展到一定程度的产物,但并不是spring的替代品,springboot是为了让程序员更好的使用spring.Spring随着发展逐 ...
- 你如何确保 main()方法所在的线程是 Java 程序最后结束 的线程?
我们可以使用 Thread 类的 join()方法来确保所有程序创建的线程在 main()方法退出前结束.