[设计模式-行为型]访问者模式(Vistor)
一句话
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
概括
解析
情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了;
访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。
实例
还是以产品的开发为例,
产品开发分为 硬件和软件两部分。
对应的有 HardwareProduct 和 SoftwareProduct 两个类, 但是现在需要提升原有类的功能, 但是又不想改动到原有的结构,所以就添加额外的“访问者” 来提升功能。
代码列表:
IVisitor.java - 访问者接口
HardwareProduct.java 具体访问者
IVisitable.java - 元素接口
HardwareProduct.java - 具体元素
SoftwareProduct.java - 具体元素
TestMain.java - 测试主类
package designptn.vistor;
public interface IVisitor {
public void visitSoftware(SoftwareProduct product);
public void visitHardware(HardwareProduct product);
}
package designptn.vistor;
import java.util.Collection;
import java.util.Iterator;
public class ConcreteVisitor implements IVisitor {
@Override
public void visitSoftware(SoftwareProduct product) {
// TODO Auto-generated method stub
System.out.println(product.getProductName());
}
@Override
public void visitHardware(HardwareProduct product) {
// TODO Auto-generated method stub
System.out.println(product.getProductName());
}
}
package designptn.vistor;
public interface IVisitable {
public void accept(IVisitor visitor);
}
/**
* @author oscar999
* @date 2013-7-17
* @version V1.0
*/
package designptn.vistor;
public class HardwareProduct implements IVisitable {
private String productName;
public HardwareProduct(String productName){
this.productName = productName;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
@Override
public void accept(IVisitor visitor) {
// TODO Auto-generated method stub
visitor.visitHardware(this);
}
}
/**
* @author oscar999
* @date 2013-7-17
* @version V1.0
*/
package designptn.vistor;
public class SoftwareProduct implements IVisitable {
private String productName;
public SoftwareProduct(String productName){
this.productName = productName;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
@Override
public void accept(IVisitor visitor) {
// TODO Auto-generated method stub
visitor.visitSoftware(this);
}
}
package designptn.vistor;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
IVisitor visitor = new ConcreteVisitor();
HardwareProduct hardProduct = new HardwareProduct("hard 1");
hardProduct.accept(visitor);
SoftwareProduct softProduct = new SoftwareProduct("soft 1");
softProduct.accept(visitor);
}
}
再增加上对象结构角色
修改ConcreteVisitor.java 和TestMain.java
package designptn.vistor;
import java.util.Iterator;
import java.util.List;
public class ConcreteVisitor implements IVisitor {
@SuppressWarnings("rawtypes")
public void visitProducts(List<IVisitable> list) {
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
if (o instanceof IVisitable) {
((IVisitable) o).accept(this);
}
}
}
@Override
public void visitSoftware(SoftwareProduct product) {
// TODO Auto-generated method stub
System.out.println(product.getProductName());
}
@Override
public void visitHardware(HardwareProduct product) {
// TODO Auto-generated method stub
System.out.println(product.getProductName());
}
}
package designptn.vistor;
import java.util.ArrayList;
import java.util.List;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteVisitor visitor = new ConcreteVisitor();
HardwareProduct hardProduct = new HardwareProduct("hard 1");
hardProduct.accept(visitor);
SoftwareProduct softProduct = new SoftwareProduct("soft 1");
softProduct.accept(visitor);
System.out.println("--------------------------");
List<IVisitable> list = new ArrayList<IVisitable>();
list.add(new HardwareProduct("hard 2"));
list.add(new HardwareProduct("hard 3"));
list.add(new SoftwareProduct("soft 2"));
list.add(new SoftwareProduct("soft 3"));
visitor.visitProducts(list);
}
}
[设计模式-行为型]访问者模式(Vistor)的更多相关文章
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...
- Java 设计模式系列(二三)访问者模式(Vistor)
Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...
- 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 能力,是你前行的最大保障 年龄会不断的增长,但是什么才能让你不 ...
- 设计模式学习之访问者模式(Visitor,行为型模式)(21)
参考:https://www.cnblogs.com/edisonchou/p/7247990.html 在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根 ...
- Java进阶篇设计模式之十 ---- 访问者模式和中介者模式
前言 在上一篇中我们学习了行为型模式的解释器模式(Interpreter Pattern)和迭代器模式(Iterator Pattern).本篇则来学习下行为型模式的两个模式,访问者模式(Visito ...
- Java设计模式之十 ---- 访问者模式和中介者模式
前言 2018年已经过去,新的一年工作已经开始,继续总结和学习Java设计模式. 在上一篇中我们学习了行为型模式的解释器模式(Interpreter Pattern)和迭代器模式(Iterator P ...
- 22.访问者模式(Vistor Pattern)
using System; using System.Collections; namespace ConsoleApplication5 { /// <summary> /// 访问者模 ...
- 设计模式のVisitorPattern(访问者模式)----行为模式
一.产生背景 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之 ...
- 《JAVA设计模式》之访问者模式(Visitor)
在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要 ...
随机推荐
- STL应用——hdu1412(set)
set函数的应用 超级水题 #include <iostream> #include <cstdio> #include <algorithm> #include ...
- Uva 1590 IP Networks
这道题目是一道关于IP地址的题目,要深入理解这道题需要有一定的网络基础. 这道题目我第一次做的时候虽然也AC了,但代码写的比较复杂,不够精炼.近期刚刚参加了网络方面的培训,在有一定知识的基础上,又重写 ...
- python 调用RESTFul接口
本周需要将爬虫爬下来的数据入库,因为之前已经写好PHP的接口的,可以直接通过python调用PHP接口来实现,所以把方法总结一下. //python编码问题,因为好久用,所以很容易出现 # -*- c ...
- nopcommerce商城系统--安装nopCommerce
原址:http://www.nopcommerce.com/docs/79/installing-nopcommerce.aspx .NET Framework 4.5.1下载:http://www. ...
- web相关基础知识1
2017-12-13 09:47:11 关于HTML 1.绝对路径和相对路径 相对路径:相对于文件自身为参考. (工作中一般是使用相对路径) 这里我们用html文件为参考.如果说html和图片平级,那 ...
- 用户代理UA
简介: 用户代理英文全称为User Agent,简称UA,现在被广泛用来标识浏览器客户端信息. 发展状况: User Agent在互联网早期就已经存在,那时互联网是完全基于文本的,用户直接浏览器互联网 ...
- 深入研究java.lang.Runtime类(转)
一.概述 Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接. 一般不能实例化一个Runtime对象, ...
- 'com.alibaba.fastjson.support.spring.FastJsonpResponseBodyAdvice' is。。。。
com.alibaba.fastjson版本1.2.43版本在通过xml方式配置spring的时候会出现这个个奇怪的问题: Class 'com.alibaba.fastjson.support.sp ...
- [洛谷P3693]琪露诺的冰雪小屋
题目大意:琪露诺的冰雪小屋,我做的第一道大模拟题. 题解:模拟... 卡点:无数小错误,要是没有写一点调一点,那大概是永远调不出来了... C++ Code: #include <cstdio& ...
- hadoop基础----hadoop实战(九)-----hadoop管理工具---CDH的错误排查(持续更新)
在CDH安装完成后或者CDH使用过程中经常会有错误或者警报,需要我们去解决,积累如下: 解决红色警报 时钟偏差 这是因为我们的NTP服务不起作用导致的,几台机子之间有几秒钟的时间偏差. 这种情况下一是 ...