文档章节

java设计模式_访问者模式

王大叔爱编程
 王大叔爱编程
发布于 2013/05/07 16:40
字数 977
阅读 87
收藏 2


1) 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。

  2) 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。

  3) 元素角色(Element):定义一个Accept操作,它以一个访问者为参数。

  4) 具体元素角色(Concrete Element):实现由元素角色提供的Accept操作。

  5) 对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。

    访问者模式结构图如下:


package com.wangbiao.test;

public interface Visitor {

	public void visit(Element_One e);
	public void visit(Element_Two e);
}

package com.wangbiao.test;

public class Visitor_Two implements Visitor {


	@Override
	public void visit(Element_One e) {
		System.out.println("Visitor_Two 访问Element_One");
	}

	
	@Override
	public void visit(Element_Two e) {
		System.out.println("Visitor_Two 访问Element_Two");
	}

}

package com.wangbiao.test;

public class Visitor_One implements Visitor{


	@Override
	public void visit(Element_One e) {
		System.out.println("Visitor_One 访问Element_One");
	}

	@Override
	public void visit(Element_Two e) {
		System.out.println("Visitor_One 访问Element_Two");
	}

}

package com.wangbiao.test;

public interface Element {

	public void accept(Visitor visitor);
}

package com.wangbiao.test;

public class Element_Two implements Element{

	@Override
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}

}

package com.wangbiao.test;

public class Element_One implements Element{

	@Override
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}

}

package com.wangbiao.test;

import java.util.ArrayList;
import java.util.List;

public class Test {

	public static void main(String[] args) {
		Visitor visitor=new Visitor_Two();
		ObjectStructure os=new ObjectStructure();
		os.addElement(new Element_One());
		os.addElement(new Element_Two());
		os.accept(visitor);
	
		
	}
}
//对象结构角色(Object Structure):这是使用访问者模式必备的角色。
//它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;
//可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。
class ObjectStructure{
	private List<Element> list=new ArrayList<Element>();
	
	public void accept(Visitor visitor){
		for (Element e : list){
			e.accept(visitor);
		}
	}
	
	public void addElement(Element e){
		list.add(e);
	}
	public void deleteElement(Element e){
		list.remove(e);
	}
}

典型运用:

在dom4j的VisitorSupport上面就有Visitor的运用。

优缺点:

先来看下访问者模式的使用能否避免引言中的痛苦。使用了访问者模式以后,对于原来的类层次增加新的操作,仅仅需要实现一个具体访问者角色就可以了,而不必 修改整个类层次。而且这样符合“开闭原则”的要求。而且每个具体的访问者角色都对应于一个相关操作,因此如果一个操作的需求有变,那么仅仅修改一个具体访 问者角色,而不用改动整个类层次。

  看来访问者模式确实能够解决我们面临的一些问题。

  而且由于访问者模式为我们的系统多提供了一层“访问者”,因此我们可以在访问者中添加一些对元素角色的额外操作。

  但是“开闭原则”的遵循总是片面的。如果系统中的类层次发生了变化,会对访问者模式产生什么样的影响呢?你必须修改访问者角色和每一个具体访问者角色……

 看来访问者角色不适合具体元素角色经常发生变化的情况。而且访问者角色要执行与元素角色相关的操作,就必须让元素角色将自己内部属性暴露出来,而在 java中就意味着其它的对象也可以访问。这就破坏了元素角色的封装性。而且在访问者模式中,元素与访问者之间能够传递的信息有限,这往往也会限制访问者 模式的使用。

© 著作权归作者所有

共有 人打赏支持
下一篇: Java_enum
王大叔爱编程

王大叔爱编程

粉丝 34
博文 111
码字总数 61053
作品 0
成都
程序员
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
java 23种设计模式 深入理解

以下是学习过程中查询的资料,别人总结的资料,比较容易理解(站在各位巨人的肩膀上,望博主勿究) 创建型 抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html ...

wc_飞豆
03/16
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
练就Java24章真经—你所不知道的工厂方法

前言 最近一直在Java方向奋斗《终于,我还是下决心学Java后台了》,今天抽空开始学习Java的设计模式了 。计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式,是因...

codeGoogle
10/30
0
0
java中23种设计模式(上)

参考网址:http://blog.csdn.net/zhangerqing 资源:http://download.csdn.net/detail/zhangerqing/4835830 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用、多数...

青涩的梦
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 钱不还,我就当你人不在了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bigleaf的单曲《小鹿》 《小鹿》- Bigleaf 手机党少年们想听歌,请使劲儿戳(这里) 周日在家做什么? 做手工呀, @poorfis...

小小编辑
21分钟前
10
1
EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
17
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
20
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
24
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部