访问者模式是行为模式的一种。访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的、比较稳定的对象结构,这些对象的类都拥有一个accept方法用来接受访问者的访问。访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素做不同的处理。

角色和职责:

1.访问者(Visitor):

   访问不同的Concrete Element

2.具体访问者(Concrete Visitor)-Boss、CPA:

具体的访问类,它需要给出对每一个元素类访问时所产生的具体行为

3.元素接口(Element)-Bill:

  元素接口或者抽象类,它定义了一个接受访问者的方法(Accept),其意义是指每一个元素都要可以被访问者访问

4.具体元素类(ConcreteElement)-ConcreteElementA、ConcreteElementB:

   具体的元素类,它提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法

5.对象结构(ObjectStructure)-AccountBook:

  定义当中所说的对象结构,对象结构是一个抽象表述,它内部管理了元素集合,并且可以迭代这些元素供访问者访问。

UML图:

具体代码:

/**
* 访问者
*/
public interface Visitor {
void visitor(ConsumeBill consumeBill);//消费情况
void visitor(IncomeBill incomeBill);//收入情况
}
/**
* 访问者:老板
*/
public class Boss implements Visitor{
private Double totalConsumeMoney = 0d;//消费总金额
private Double totalIncomeMoney = 0d;//收入总金额
@Override
public void visitor(ConsumeBill consumeBill) {
totalConsumeMoney += consumeBill.getMoney();
} @Override
public void visitor(IncomeBill incomeBill) {
totalIncomeMoney += incomeBill.getMoney();
} public void display(){
System.out.println("总收入:"+this.totalIncomeMoney+",总消费:"+this.totalConsumeMoney);
}
}
/**
* 访问者:会计访问,做操作
*/
public class CPA implements Visitor{
@Override
public void visitor(ConsumeBill consumeBill) {
if(consumeBill.getType().equalsIgnoreCase("工资")){//公司消费工资,也是要给税的
System.out.println("发工资"+consumeBill.getMoney()+"元,交税");
}
} @Override
public void visitor(IncomeBill incomeBill) {
//会计做账,每一笔收入要给税
System.out.println(incomeBill.getType()+",收入金额:"+incomeBill.getMoney()+"元,"+"交税");
}
}
/**
* element :元素接口
*/
public interface Bill {
void accept(Visitor visitor);
}
/**
* 消费情况
*/
public class ConsumeBill implements Bill{
private Double money;//消费金额
private String type;//消费类型
public ConsumeBill(Double money,String type){
this.money = money;
this.type = type;
} @Override
public void accept(Visitor visitor) {
visitor.visitor(this);
} public Double getMoney() {
return money;
} public String getType() {
return type;
} }
/**
* 收入情况
*/
public class IncomeBill implements Bill{
private Double money;//收入金额
private String type;//收入类型
public IncomeBill(Double money,String type){
this.money = money;
this.type = type;
} @Override
public void accept(Visitor visitor) {
visitor.visitor(this);
} public Double getMoney() {
return money;
} public String getType() {
return type;
}
}
/**
* 对象结构: 帐簿
*/
public class AccountBook {
private List<Bill> list = new ArrayList<Bill>(); /**
* 添加流水
* @param bill
*/
public void add(Bill bill){
list.add(bill);
} /**
* 供账本的查看者查看账本
* @param visitor
*/
public void show(Visitor visitor){
for(Bill bill:list){
bill.accept(visitor);
}
}
}
public class Main {
public static void main(String[] args) {
//添加消费记录
ConsumeBill consumeBillCloth = new ConsumeBill(23.24,"进购打印机");
ConsumeBill consumeBillShoes = new ConsumeBill(212.99,"进购桌子");
ConsumeBill consumeBillSalary = new ConsumeBill(3000.00,"工资");
IncomeBill incomeBillAlipay = new IncomeBill(300.66,"卖维护");
IncomeBill incomeBillWechat = new IncomeBill(123.88,"卖软件"); //帐蒲
AccountBook accountBook = new AccountBook();
accountBook.add(consumeBillCloth);
accountBook.add(consumeBillShoes);
accountBook.add(consumeBillSalary);
accountBook.add(incomeBillAlipay);
accountBook.add(incomeBillWechat); //老板过来访问
Boss boss = new Boss();
accountBook.show(boss);
boss.display();
System.out.println("-------------------"); //会计过来访问
CPA cpa = new CPA();
accountBook.show(cpa);
}
}

结果:

总收入:424.54,总消费:3236.23
-------------------
发工资3000.0元,交税
卖维护,收入金额:300.66元,交税
卖软件,收入金额:123.88元,交税

使用场景:
(1)对象结构比较稳定,但经常需要在此对象结构上定义新的操作。

(2)需要对一个对象结构中的对象进行很多不同的且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。

源码地址:https://github.com/qjm201000/design_pattern_visitor.git

设计模式-访问者模式(Visitor)的更多相关文章

  1. 设计模式 -- 访问者模式(Visitor)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识访问者模 ...

  2. C#设计模式——访问者模式(Visitor Pattern)

    一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...

  3. 大话设计模式--访问者模式 Visitor -- C++实现实例

    1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...

  4. 深入浅出设计模式——访问者模式(Visitor Pattern)

    模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...

  5. 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)

    设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...

  6. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

  7. 访问者模式 Visitor 行为型 设计模式(二十七)

    访问者模式 Visitor    <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白:  “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...

  8. 二十四种设计模式:访问者模式(Visitor Pattern)

    访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...

  9. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  10. JAVA 设计模式 访问者模式

    用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途

随机推荐

  1. 脚本 启动/停止 jar包服务

    windows (.bat): @set port=8692 @echo %port% for /f "tokens=5" %%i in ('netstat -aon ^| fin ...

  2. 关于hibernate组件配置

    建立关系数据模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系.以员工信息为例,员工信息中有员工的家庭地址信息,如果把地址信息单独放在一张表中,然后建立员工 ...

  3. VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中(C#)

    原文:VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中(C#) 在开发项目时,需要知道当前发布的到底是哪个版本,比较好的方式就是获取SVN的版本来作为项目的版本.项目版本一般由主版 ...

  4. SwiftCafe 咖啡时光 - 了解 Swift 中的闭包

    闭包(Closure) 是现代开发语言的必备特性,极大的提高了我们的开发效率. 关于闭包,你可以把它理解为一种特殊的变量或对象.简而言之,我们通常的对象,里面存储的是变量或对象的值,而闭包里面存储的是 ...

  5. XF 列表视图事件

    <?xml version="1.0" encoding="utf-8" ?><ContentPage xmlns="http:// ...

  6. 用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件

    原文:用MVVM模式开发中遇到的零散问题总结(4)--自制摄像头拍摄大头贴控件 一直有个疑问,为什么silverlight对摄像头支持这么好,WPF却一个库都没有....于是我各种苦恼啊,各种Code ...

  7. Html5 学习系列(四)文件操作API

    原文:Html5 学习系列(四)文件操作API 引言 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或者跨 ...

  8. 使用path制作各类型动画路径

    原文:使用path制作各类型动画路径 <Window x:Class="使用path制作各类型动画路径.MainWindow" xmlns="http://sche ...

  9. SQL 修改主键约束

    原文:SQL 修改主键约束 今天在学习数据库的时候遇到一个关于如何修改主键约束的问题,抄录下来以供备用. --修改主键约束用SQL --获取主键约束名字 declare @csname varchar ...

  10. Win10《芒果TV》商店版更新v3.1.3.0:优化应用速度,支持会员卡兑换

    在微软秋季Win10/Surface新品发布会热潮之后,<芒果TV>UWP版迅速更新v3.1.3版,优化应用启动速度,支持会员卡券兑换,新增全网搜索.记忆播放.消息推送等功能. 芒果TV ...