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数据类型详解
			
基本概念 迭代(iteration):如果给定一个list或tuple,我们可以通过for循环来遍历,这种遍历我们称为迭代(iteration) 可变:value改变,id不变,可变类型是不可hash ...
 - Kendo UI Grid 使用总结
			
Kendo UI Grid控件的功能强大,这里将常用的一些功能总结一下. Kendo UI Grid 固定列 在使用Gird控件显示数据时,如果数据列过多,会出现横向滚动条,很多情况下,我们希望某些列 ...
 - php 23种设计模型 - 门面模式(外观模式)
			
外观模式(Facade) 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系 ...
 - 面试题详解:如何用Redis实现分布式锁?
			
说一道常见面试题: 使用Redis分布式锁的详细方案是什么? 一个很简单的答案就是去使用 Redission 客户端.Redission 中的锁方案就是 Redis 分布式锁的比较完美的详细方案. 那 ...
 - CF1017F题解
			
这种板子题怎么能没有min25筛的题解呢??? 题意:给定一个完全和性函数,求其前缀和.其实普通和性函数也能做就是了 \[\sum_{i=1}^n f(i) \] 类似积性函数,我们把这玩意儿在质数幂 ...
 - VuePress 博客优化之增加 Vssue 评论功能
			
前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇讲讲 ...
 - 服务器中一个进程kill不掉,如何处理?
			
问题描述: 我们在服务器中有时候kill一个进程,会碰到死活杀不死的情况,那么有可能这个进程成为了一个僵尸进程,zombie状态.这种情况是这个进程释放了资源,但是没有得到父进程的确认. 可以使用命令 ...
 - Python可变参数*args和**kwargs
			
本文我们将通过示例了解 Python函数的可变参数*args和 **kwargs的用法. 知识预备:Python 函数和 Python 函数参数 在Python编程中,我们定义一个函数来生成执行类似操 ...
 - 各种环境下反弹shell
			
0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或者UDP模式,添加参数 -u 则 ...
 - 内网渗透----Linux下信息收集
			
基础信息 1.系统类型 cat /etc/issue查看系统名称 Lsb-release查看系统名称.版本号 2. 内核版本 uname –a 查看所有信息 ls /root |grep vmlinu ...