visitor模式,又叫访问者模式,把结构和数据分开,编写一个访问者,去访问数据结构中的元素,然后把对各元素的处理全部交给访问者类。这样,当需要增加新的处理时候,只需要编写新的 访问者类,让数据结构可以接受访问者的访问即可。

本次,我们以电脑装机为例。需求是,想组装一台电脑,有三个硬件,显卡,CPU和硬盘,想装进电脑主机箱里面,只能采取接口的方式。首先我们假设使用的是usb接口去连接。

下面是具体的代码:因为要表现出接口可换的概念,我采用的是将电脑硬件和电脑本身的类以及接口的interface接口类放到一个包里面,设定这个包为框架包,是不允许修改的。

在框架包中

  • ComputerPart硬件的父类,抽象类
package site.wangxin520.gof.visitor.framework;

/**
* 电脑的零配件的父抽象类
* @author wangXgnaw
*
*/
public abstract class ComputerPart { /**
* 所有的 零配件,都必须通过一个硬件接口进行连接
* @param hardwareInterface
*/
protected abstract void link(HardwareInterface hardwareInterface); }
  • 硬件的实现类CPU,下同
package site.wangxin520.gof.visitor.framework;

/**
* 电脑的硬件CPU,用于数据的运算
*
* @author wangXgnaw
*
*/
public class CPU extends ComputerPart { @Override
protected void link(HardwareInterface hardwareInterface) { // 先得通过接口连接数据
hardwareInterface.visitor(this);
// 连接完了之后,就开始使用cpu
System.out.println("连接上了之后,利用cpu进行计算数据");
} }
  • 显卡VideoCard
package site.wangxin520.gof.visitor.framework;

/**
* 电脑硬件之显卡 通过显卡可以进行电脑的屏幕图像的显示
*
* @author wangXgnaw
*
*/
public class VideoCard extends ComputerPart { @Override
protected void link(HardwareInterface hardwareInterface) { // 必须先用接口连接上显卡
hardwareInterface.visitor(this); System.out.println("连接上显卡之后,显卡开始工作,提供图像");
} }
  • 硬盘HardDisk
package site.wangxin520.gof.visitor.framework;

/**
* 电脑硬件之硬盘
*
* @author wangXgnaw
*
*/
public class HardDisk extends ComputerPart { @Override
protected void link(HardwareInterface hardwareInterface) {
// 必须先通过接口,把硬盘先连上,然后才能操作
hardwareInterface.visitor(this);
// 硬盘开始干活
System.out.println("硬盘以及连接上了,开始存储数据");
} }
  • Computer,电脑(主机箱)类
package site.wangxin520.gof.visitor.framework;

/**
* 电脑的类,当需要装机的话,就先准备好硬件,即new出来,然后插上接口
* @author wangXgnaw
*
*/
public class Computer { /**
* 想装机,先得提供硬件接口才行
* @param hardwareInterface
*/
public void useComputer(HardwareInterface hardwareInterface){ //通过接口,连接cpu
new CPU().link(hardwareInterface);
//通过接口,连接显卡
new VideoCard().link(hardwareInterface);
//通过接口连接硬盘
new HardDisk().link(hardwareInterface); }
}
  • 硬件的接口类
package site.wangxin520.gof.visitor.framework;

/**
* 硬件的接口
* @author wangXgnaw
*
*/
public interface HardwareInterface { //定义了一些接口,访问硬件用的
public void visitor(CPU cpu);
public void visitor(VideoCard vCard);
public void visitor(HardDisk hd); }

把上面的框架包封装起来,因为访问者模式要求,结构不能变化,只能变化数据操作上。

下面是可操作的包的内容:

  • 自定义的接口类
package site.wangxin520.gof.visitor.use;

import site.wangxin520.gof.visitor.framework.CPU;
import site.wangxin520.gof.visitor.framework.HardDisk;
import site.wangxin520.gof.visitor.framework.HardwareInterface;
import site.wangxin520.gof.visitor.framework.VideoCard; /**
* 自定义的接口,实现了硬件接口的借口类
* @author wangXgnaw
*
*/
public class USBInterface implements HardwareInterface{ @Override
public void visitor(CPU cpu) {
System.out.println("usb连接cpu");
} @Override
public void visitor(VideoCard vCard) {
System.out.println("用usb连接显卡");
} @Override
public void visitor(HardDisk hd) {
System.out.println("用usb连接硬盘");
} }
  • 测试类
package site.wangxin520.gof.visitor.use;

import site.wangxin520.gof.visitor.framework.Computer;

/**
* 访问者模式的测试类
* @author wangXgnaw
*
*/
public class Test { public static void main(String[] args) { //想要装机,先得装电脑的架子
Computer computer=new Computer();
//有架子后,就想着用什么接口去装电脑,这里是用usb接口去连接里面的硬件的。当然,也可以去换成其他接口
computer.useComputer(new USBInterface());
} }
  • 控制台输出结果

由此可见,visitor模式以及测试成功。

visitor模式的一大特点就是,结构是固定死的,你是不能改的,但你可以改一些结构的实现方式,即上述实例中的usb接口,你可以换成其他接口比如PCI……只要实现规定好的硬件接口interface类即可,这样一来,任凭怎么扩展,都不会修改到底层的结构,不会损坏“框架”了。

不过,这也算是最大的缺点。就是不能扩展里面的内容,就上述内容来说,只能扩展接口,而不能扩展里面硬件,或者修改电脑硬件的实现方式!

设计模式之——visitor模式的更多相关文章

  1. 设计模式之visitor模式,人人能懂的有趣实例

    设计模式,现在在网上随便搜都一大堆,为什么我还要写"设计模式"的章节呢? 两个原因: 1.本人觉得这是一个有趣的设计模式使用实例,所以记下来: 2.看着设计模式很牛逼,却不知道怎么 ...

  2. 设计模式之Visitor模式(笔记)

    訪问者模式:表示一个作用于某个对象结构中的各元素操作.它使你能够不改变各元素的类的前提下定义作用于这些元素的新操作. 首先定义一个visitor抽象类,为每一个详细类声明一个visit操作 publi ...

  3. 设计模式:visitor模式

    核心:将数据结构和数据的处理分开 注意:注意函数的参数传递和调用关系 例子: class Element; class Visitor { public: virtual void Visit(Ele ...

  4. [设计模式] 23 访问者模式 visitor Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...

  5. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

  6. 设计模式:基于线程池的并发Visitor模式

    1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...

  7. 设计模式---行为变化模式之访问器模式(Visitor)

    一:概念 访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作角色和职责. 二:动机 在软件构建的过程中,由于需求的改变,某些类层次结构中 ...

  8. 设计模式(17) 访问者模式(VISITOR) C++实现

    意图: 表示一个作用于某对象结构的各元素的操作.它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作. 动机: 之前在学校的最后一个小项目就是做一个编译器,当时使用的就是访问者模式. 在静态 ...

  9. Visitor模式(访问者设计模式)

    Visitor ? 在Visitor模式中,数据结构与处理被分离开来.我们编写一个表示"访问者"的类来访问数据结构中的元素, 并把对各元素的处理交给访问者类.这样,当需要增加新的处 ...

随机推荐

  1. 关于HTTP keep-alive的实验(转至 http://my.oschina.net/flashsword/blog/80037)

    前面一篇文章提到,HTTP1.1中持久连接已经是默认配置,除非设置Connection为close,否则默认都会进行持久连接.但是我们知道事实标准跟教科书还是可能会有一定差距的,所以不妨自己尝试一下. ...

  2. u3d调用c++ dll的DllNotFoundExceion 问题

    原文地址:http://blog.csdn.net/boren31/article/details/8778504 问题年年有,今年特别多. 开发环境: Windows  XP sp3 Visual  ...

  3. chrome浏览器默认启动时打开2345导航的解决方法

    2345并没有改动chrome内部设置.它仅仅是把全部的快捷方式改动了.包含開始菜单旁边的快捷启动图标. 仅仅须要右键chrome快捷方式.在目标一栏中,把"----chrome.exe&q ...

  4. 搭建LNMP+CI环境

    首先搭建 LNMP 的服务器环境 安装 Nginx, MySQL 和 PHP 软件包,执行以下命令 yum install -y nginx mariadb-server mariadb php ph ...

  5. 九度 1534:数组中第K小的数字(二分法变形)

    题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C.譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6].现在给你数组A和B,求 ...

  6. swift - UISlider 的用法

    swift的UISlider的用法和oc基本没有区别 1.创建 class SecondViewController: UIViewController { var slider = UISlider ...

  7. Android使用百度定位API时获取的地址信息为null

    option.setAddrType("all"); //加上这个配置后才可以取到详细地址信息

  8. Keil MDK从未有过的详细使用讲解(转)

    这博主关于MDK 的使用的文章,写的得TM的好  TM的实用! 真心收藏! 熟悉Keil C 51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论 ...

  9. Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取

    为什么要写这篇文章 1.      因为最近在学习<软件调试>这本书,看到书中的某个调试历程中讲了Windows的系统调用的实现机制,其中讲到了从Ring3跳转到Ring0之后直接进入了K ...

  10. java基础---->java中国际化的实现

    应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产.开发这样的程序的过程,就称为国际化.今天,我们就开始学习java中国际化的代码实现. Java国际化主要通过如下3个类 ...