文档章节

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

合拍
 合拍
发布于 2017/08/25 18:19
字数 1050
阅读 14
收藏 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
练就Java24章真经—你所不知道的工厂方法

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

codeGoogle
09/04
0
0
java开发中的常用的设计模式

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

qq_38024548
05/28
0
0
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
09/10
0
0
设计模式: Java中的工厂设计模式

原文链接 https://github.com/shellhub/blog/issues/22 前言 工厂设计模式(Factory Design Pattern)属于创建模式之一,工厂设计模式在JDK,Spring,Stuts被广泛使用 当一个类或者接口有多个子类...

shellhub
08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS 7.* 配置网络

配置静态IP 进入配置文件目录 cd /etc/sysconfig/network-scripts 查找以 ifcfg-eno 开头的文件并编辑它 vi ifcfg-ens32 修改文件中的变量值 BOOTPROTO=staticONBOOT=yesIPADDR=192.168...

阿白
49分钟前
0
0
深入理解OAuth2.0协议

1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间。是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题。豪车一般配备两种钥匙:主钥匙和泊...

xtof
53分钟前
1
0
Linux学习-0920

3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令 一、usermode命令 usermode作用是用来修改用户信息。 方法: usermod 参数 username 示例1:修改用户uid usermod -u 1010 test5 示例2...

wxy丶
今天
1
0
synchronized锁对象的坑

今天本来写点其他东西,碰巧写了一下synchronized,没想到掉坑里面了,大佬别笑。 起初代码大概是这样的: package com.ripplechan.part_1_2_3;import java.util.concurrent.CountDownL...

RippleChan
今天
1
0
XAMPP环境搭建(Apache + MariaDB + PHP + Perl)

operation system:ubuntu-18.04.1 step1:download XAMPP #sudo wget https://www.apachefriends.org/xampp-files/7.2.9/xampp-linux-x64-7.2.9-0-installer.run step2:install XAMPP #sudo ......

硅谷课堂
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部