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 ...
随机推荐
- Python——模块&包&异常
模块&包&异常 一. 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义(变量)和Python语句. 模块能定义函数 ...
- 使用 kubebuilder 创建并部署 k8s-operator
一.准备 本文中的示例运行环境及相关软件版本如下: Kubernetes v1.16.3 Go 1.15.6 Kubebuilder 3.1.0 Docker 20.10.7 安装kubebuilde ...
- Python 学习路线(2022)
原文链接: Python 学习路线(2022) 前几天整理了一份 Go 学习路线(2022),广受好评.那么趁火打劫,不是,是趁热打铁,又整理了一份 Python 学习路线. 内容依然是从入门到进阶, ...
- Maven插件mybatis-generator,如何让生成的PO类的field上有对应表字段的注释
前言 去年刚入职的时候,我就发现,po类(和数据库表对应的类)上,一片都是光秃秃的,什么注释都没有,类上没注释,field上也没注释. 在以前的项目中,其实我们都是有生成注释的,比如,对于下面这个表: ...
- java几种数据的默认扩容机制
当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上, 这无疑使效率大大降低.加载因 ...
- MM32F0140 UART1空闲中断接收
目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1空闲中断和NVIC中断 3.编写MM32F0140 UART1中断接收和空闲中断函数 4.编写MM32F0140 UART1 ...
- Wireshark抓包工具解析HTTPS包
目录 一.遇到的问题 二.解决方案 1. 动态生成签名证书 2. Wireshark配置 3. 最终效果 一.遇到的问题 本学期的计算机网络课程需要使用到Wireshark抓包工具进行网络抓包实验,原 ...
- CentOS下mysql常用命令
CentOS下mysql常用命令 1.开启和关闭 1.1.开启 service mysql start 1.2.关闭 service mysql stop 1.3.重启 service mysql ...
- MySQL主从复制介绍:使用场景、原理和实践
MySQL主从复制介绍:使用场景.原理和实践 MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借 ...
- Applied Social Network Analysis in Python 相关笔记3
如果是option2的话,答案选A. 这里节点s,从左边的选择,节点t从右边选择. 这里计算还是用以前的值,不用更新过的值.