文档章节

java设计模式(二十二)--访问者模式

合拍
 合拍
发布于 2017/08/25 18:19
字数 1050
阅读 16
收藏 0

这是我的最后一篇关于java设计模式的博客,这是第23种模式。 对于访问者模式,就是通过调用不同的访问者的相同方法来完成对实现了相同接口的不同事物的访问,已达到显示不同结果的需要。

在这种模式中,可以说就分为两部分即可:访问者和被访问者。

访问者部分:
1. 要实现一个有着共同方法的但是实现不同的一个访问者接口 2. 实现此访问者接口的各种实现类,实现方法来访问不同的被访问者

被访问者部分:
1. 要实现一个有着共同方法的但是实现不同的一个被访问者接口 2. 实现此被访问者接口的多个实现类 3. 创建一个可以让访问者一次可以访问多个事物的类,其中可以通过集合遍历来实现

网络上的专业解释:

此模式中,使用了一个访问者类,它改变了元素的执行算法,元素的执行算法随着访问者的变化而变化,这样访问对象就可以处理元素对象上的操作。

实例:用此模式实现不同访问者完成对电脑不同部分的访问。

以下是我所画的类图:

输入图片说明

以下是代码: 1.新建一个电脑一部分的接口

interface ComputerPart{
	public  void operate(Visitor visitor);
	public String doAction();
}

2.创建电脑一部分接口的三个实现类(键盘,鼠标,主机)

public class Keyboard implements ComputerPart
{
	@Override
	public void operate(Visitor visitor)
	{
		visitor.visit(this);
	}

	@Override
	public String doAction()
	{
		return "it is keyboard...";
	}
}

public class Mouse implements ComputerPart
{
	@Override
	public void operate(Visitor visitor)
	{
		visitor.visit(this);
	}

	@Override
	public String doAction()
	{
		return "it is mouse...";
	}
}

public class Host implements ComputerPart
{
	@Override
	public void operate(Visitor visitor)
	{
		visitor.visit(this);
	}

	@Override
	public String doAction()
	{
		return "it is host...";
	}
}

3.创建电脑的整体类(可以使访问者访问电脑的好多部分)

public class Computer
{
	private static final List<ComputerPart> cps=new ArrayList<ComputerPart>();
	
	public void doAction(Visitor visitor){
		
		for(ComputerPart item:cps){
			item.operate(visitor);
		}
	}
	public void addElements(ComputerPart cp){
		cps.add(cp);
	}
}

4.新建访问者接口

interface Visitor
{
	void visit(ComputerPart cp);
	void visit(Computer computer);
}

5.创建访问者接口的实现类,是可以产生多个访问者对象

public class Visitor_1 implements Visitor
{
	@Override
	public void visit(ComputerPart cp)
	{
		System.out.println("i am visitor_1,i visite "+cp.doAction());
	}

	@Override
	public void visit(Computer computer)
	{
		System.out.println("i am visitor_1,i visite all computerPart...");
		computer.doAction(this);
	}
}

public class Visitor_2 implements Visitor
{
	@Override
	public void visit(ComputerPart cp)
	{
		System.out.println("i am visitor_2,i visite "+cp.doAction());
	}

	@Override
	public void visit(Computer computer)
	{
		System.out.println("i am visitor_2,i visite all computerPart...");
		computer.doAction(this);
	}
}

6.创建测试类,测试不同的访问者对电脑部分和整体电脑的不同访问结果

public class Test
{
	public static void main(String[] args)
	{
		//访问者1电脑的某一部分
		Visitor v1=new Visitor_1();
		v1.visit(new Keyboard());
		v1.visit(new Mouse());
		v1.visit(new Host());
		//新建访问者2对象
		Visitor v2=new Visitor_2();
		//新建电脑类,可向其中添加各种电脑部分
		Computer computer=new Computer();
		computer.addElements(new Keyboard());
		computer.addElements(new Mouse());
		computer.addElements(new Host());
		//访问整个电脑
		v2.visit(computer);
	}
}

7.后台运行

i am visitor_1,i visite it is keyboard...
i am visitor_1,i visite it is mouse...
i am visitor_1,i visite it is host...
i am visitor_2,i visite all computerPart...
i am visitor_2,i visite it is keyboard...
i am visitor_2,i visite it is mouse...
i am visitor_2,i visite it is host...

此模式的优点:

    1.扩展方便,要添加类只需实现其中的接口即可。
    2.访问者类中有且只有一个改变的原因,也就是被访问者的实现类,使访问者中的功能都比较单一,所以这       符合类的单一职责原则。
    3.在这模式中,数据结构都放到了访问者部分,各种行为和实现结果都放到了被访问者部分,所以实现了数据结构和行为的分离。

缺点:

    1.对于添加具体类中的元素比较麻烦,在访问者和被访问者中的代码都要修改。
    2.被访问者中的实现方法和元素都会公开给访问者,这样的话就使这两者耦合度提高,违反了”迪米特原则”。

© 著作权归作者所有

共有 人打赏支持
合拍
粉丝 0
博文 24
码字总数 20938
作品 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
练就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
设计模式15——Template Method设计模式

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

小米米儿小
2014/01/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

BigDecimal 比较大小

通过BigDecimal的compareTo方法来进行比较。 返回的结果是int类型: -1表示小于,0是等于,1是大于

嘴角轻扬30
5分钟前
1
0
PHP实现excel导出

1:前端代码 <div id=‘export’>导出excel表单</div> // //导入excel文件 $("#export").on('click', function(){ $.ajax({ url:"importexcel.php", type:'POST', dataType:'json', data:{}......

葬-花
6分钟前
1
0
内存性能的正确解读

一台服务器,不管是物理机还是虚拟机,必不可少的就是内存,内存的性能又是如何来衡量呢。 1. 内存与缓存 现在比较新的CPU一般都有三级缓存,L1 Cache(32KB-256KB),L2 Cache(128KB-2MB)...

阿里云官方博客
8分钟前
1
0
《边缘云计算技术及标准化白皮书》

12月12日,第八届中国云计算标准和应用大会在北京隆重召开,工业和信息化部党组成员,总工程师张峰先生,中国工程院副院长陈左宁女士,中国工程院院士沈昌祥先生,中国电子技术标准化研究院院...

阿里云云栖社区
9分钟前
1
0
iOS 官方文档

https://developer.apple.com/library/prerelease/content/navigation/#section=Platforms&topic=iOS...

walking_yxf
23分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部