文档章节

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

合拍
 合拍
发布于 2017/08/25 18:19
字数 1050
阅读 11
收藏 0
点赞 0
评论 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开发中的常用的设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

qq_38024548
05/28
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
java中23种设计模式(上)

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

青涩的梦
06/26
0
0
Java开发中的23种设计模式详解

设计模式(Design Patterns) ——可复用面向对象软件的基础 设 计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

java-苦苦甜甜
2014/04/21
0
1
Java之美[从菜鸟到高手演变]之设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

只想一个人静一静
2014/02/25
0
2
设计模式15——Template Method设计模式

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

小米米儿小
2014/01/24
0
0
面向对象编程语言中的函数式编程--为命令模式和访问者模式正名

函数式编程是最近被热炒的一个概念。国内外众多大牛纷纷发表文章,认为函数编程可能会再度兴起。搞得一向喜欢跟风的小弟我如坐针毡。因此,也抽空研究了一下函数式编程这个时髦的概念。 上个...

mj4738
2011/11/01
0
0
Java之23种设计模式解析(一)

一、设计模式概述 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模...

wersdffg
2015/02/15
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring boot中swagger2使用

1.pom.xml中添加 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version>......

说回答
3分钟前
0
0
tomcat虚拟路径的几种配置方法

tomcat虚拟路径的几种配置方法 一般我们都是直接引用webapps下面的web项目,如果我们要部署一个在其它地方的WEB项目,这就要在TOMCAT中设置虚拟路径了,Tomcat的加载web顺序是先加载 $Tomcat_ho...

Helios51
15分钟前
1
0
Mac 安装jupyter notebook的过程

MAC台式机 python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setuptools 工具:sudo pip install setuptools==33.1.1 3.安装......

火力全開
21分钟前
0
0
导航守卫解释与例子

“导航”表示路由正在发生改变。 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。 记住...

tianyawhl
21分钟前
0
0
Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)

说明:这种方式应该算是最通用的,原理是通过判断标签实现。 <!-- if-then form --> <if condition="some conditional expression"> <then> ... </then> </if> ......

浮躁的码农
35分钟前
1
0
FTP传输时的两种登录方式和区别

登录方式 匿名登录 用户名为: anonymous。 密码为:任何合法 email 地址。 授权登录 用户名为:用户在远程系统中的用户帐号。 密码为:用户在远程系统中的用户密码。 区别 匿名登录 只能访问...

寰宇01
36分钟前
0
0
plsql developer 配置监听(不安装oracle客户端)

plsql developer 配置监听(不安装oracle客户端)

微小宝
43分钟前
1
0
数据库(分库分表)中间件对比

本人的宗旨就是,能copy的,绝对不手写。 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm。 根据一定的规则把数据文件(MYD)和索...

奔跑吧代码
47分钟前
2
0
Netty与Reactor模式详解

在学习Reactor模式之前,我们需要对“I/O的四种模型”以及“什么是I/O多路复用”进行简单的介绍,因为Reactor是一个使用了同步非阻塞的I/O多路复用机制的模式。 I/O的四种模型 I/0 操作 主要...

hutaishi
54分钟前
1
0
【2018.07.16学习笔记】【linux高级知识 20.16-20.19】

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

lgsxp
59分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部