一句话

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

概括

解析

情人节到了,要给每个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)的更多相关文章

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

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

  2. Java 设计模式系列(二三)访问者模式(Vistor)

    Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...

  3. 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 能力,是你前行的最大保障 年龄会不断的增长,但是什么才能让你不 ...

  4. 设计模式学习之访问者模式(Visitor,行为型模式)(21)

    参考:https://www.cnblogs.com/edisonchou/p/7247990.html 在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根 ...

  5. Java进阶篇设计模式之十 ---- 访问者模式和中介者模式

    前言 在上一篇中我们学习了行为型模式的解释器模式(Interpreter Pattern)和迭代器模式(Iterator Pattern).本篇则来学习下行为型模式的两个模式,访问者模式(Visito ...

  6. Java设计模式之十 ---- 访问者模式和中介者模式

    前言 2018年已经过去,新的一年工作已经开始,继续总结和学习Java设计模式. 在上一篇中我们学习了行为型模式的解释器模式(Interpreter Pattern)和迭代器模式(Iterator P ...

  7. 22.访问者模式(Vistor Pattern)

    using System; using System.Collections; namespace ConsoleApplication5 { /// <summary> /// 访问者模 ...

  8. 设计模式のVisitorPattern(访问者模式)----行为模式

    一.产生背景 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之 ...

  9. 《JAVA设计模式》之访问者模式(Visitor)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要 ...

随机推荐

  1. HDU 4588 Count The Carries(数学统计)

    Description One day, Implus gets interested in binary addition and binary carry. He will transfer al ...

  2. mac下使用clion构建boost库

    mac下使用clion构建boost库 使用brew install boost 完成后发现boost被安装在在/usr/local/Cellar/boost下 jetbrain给出的指导意见 htt ...

  3. 从微软msdn阅读事件的使用

    微软文章:如何:在 Windows 窗体应用程序中使用事件 地址:https://msdn.microsoft.com/zh-cn/library/0y0987sc.aspx 文章:C#事件的订阅与触 ...

  4. 基于log4j的消息流的实现之一消息获取

    需求: 目前的程序中都是基于log4j来实现日志的管理,想要获取日志中的一部分消息,展示给用户. 约束: 由于程序中除了自己开发的代码,还会有层层依赖的第三方jar中的日志输出.需要展示给用户的消息, ...

  5. HTML5<canvas>标签:简单介绍(0)

    <canvas> 标签是 HTML 5 中的新标签,像所有的dom对象一样它有自己本身的属性.方法和事件, 其中就有绘图的方法,js能够调用它来进行绘图 ,最近在研读<html5与c ...

  6. 颜色采集器colpick Color Picker

    简单 RGB.HSB.十六进制颜色选取器 jQuery 插件. 非常直观类似 Photoshop 的界面. 光明和黑暗很容易自定义 CSS3 外观. 28 KB 总由浏览器加载看起来不错甚至在 IE7 ...

  7. TYVJ 1035 / codevs 2171 棋盘覆盖

    Problem Description 给定一个n * m的棋盘,已知某些各自禁止放置,求最多往棋盘上放多少长度为2宽度为1的骨牌(骨牌不重叠) Input 第一行为n,m(表示有m个删除的格子)第二 ...

  8. 整理一些JavaScript时间处理扩展函数

    在JavaScript中,时间处理是经常需要用到的.最近想要慢慢建立自己的代码库,整理了几个之前用到的js处理时间的函数,发出来跟大家分享一下,以后的使用中会不断增加和修改代码库. 把字符串转换为日期 ...

  9. java使用JNA调用dll

    1.自己搞一个dll出来.参考下面链接 http://blog.csdn.net/lqena/article/details/46357165. 2.下载jar jna-4.2.1.jar. 3.复制 ...

  10. spring结合Mybatis的框架搭建(一)

    一:前沿 2015年新年上班的第二天,第一天就打了一天的酱油哦,只是下午开始搭建自己毕业设计的框架,搭建的是spring+spring mvc+MyBatis的框架.今天遇到了一个问题,结果弄了我一天 ...