訪问者模式:表示一个作用于某个对象结构中的各元素操作。它使你能够不改变各元素的类的前提下定义作用于这些元素的新操作。

首先定义一个visitor抽象类,为每一个详细类声明一个visit操作

public abstract class Visitor {

    public abstract void visitConcreteElementA(ConcreteElementA elementA);

    public abstract void visitConcreteElementB(ConcreteElementB elementB);
}

接着定义继承visitor的详细类

public class ConcreteVisitor1 extends Visitor{

    @Override
public void visitConcreteElementA(ConcreteElementA elementA) { System.out.println(elementA.getClass().getName()+"訪问"+this.getClass().getName()); } @Override
public void visitConcreteElementB(ConcreteElementB elementB) { System.out.println(elementB.getClass().getName()+"訪问"+this.getClass().getName()); } } public class ConcreteVisitor2 extends Visitor{ @Override
public void visitConcreteElementA(ConcreteElementA elementA) { System.out.println(elementA.getClass().getName()+"訪问"+this.getClass().getName()); } @Override
public void visitConcreteElementB(ConcreteElementB elementB) { System.out.println(elementB.getClass().getName()+"訪问"+this.getClass().getName()); } }

然后定义一个Element抽象类,定义一个Accept方法

public abstract class Element {

    public abstract void accept(Visitor visitor);
}

接着定义继承Element的详细类

public class ConcreteElementA extends Element{

    @Override
public void accept(Visitor visitor) { visitor.visitConcreteElementA(this); } public void operationA(){ } } public class ConcreteElementB extends Element{ @Override
public void accept(Visitor visitor) { visitor.visitConcreteElementB(this); } public void operationB(){ }
}

然后定义一个ObjectStructure类,用来枚举它的元素

public class ObjectStructure {

    private List<Element> elements=new ArrayList<Element>();

    public void attach(Element element){
elements.add(element);
} public void detach(Element element){
elements.remove(element);
} public void accept(Visitor visitor){
Iterator<Element> iterator=elements.iterator();
while(iterator.hasNext()){
Element element=iterator.next();
element.accept(visitor);
}
}
}

client代码

public static void main(String[] args) {

        //訪问者模式
ObjectStructure oStructure=new ObjectStructure();
oStructure.attach(new ConcreteElementA());
oStructure.attach(new ConcreteElementB()); ConcreteVisitor1 visitor1=new ConcreteVisitor1();
ConcreteVisitor2 visitor2=new ConcreteVisitor2(); oStructure.accept(visitor1);
oStructure.accept(visitor2);
}

设计模式之Visitor模式(笔记)的更多相关文章

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

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

  2. 设计模式之——visitor模式

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

  3. 设计模式:visitor模式

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

  4. 设计模式之Composite模式(笔记)

    组合模式:将对象组合成树形结构以表示"部分-总体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 适用场合:当需求中是体现部分与总体层次的结构时,以及希望用户 ...

  5. 《图解设计模式》读书笔记6-1 VISITOR模式

    目录 1. Visitor模式简介 2. 示例 2.1 类图 2.2 代码 3. 模式的角色和类图 4. 思路拓展 4.1 双重分发 4.2 开闭原则 4.3 难以增加ConcreteElement角 ...

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

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

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

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

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

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

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

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

随机推荐

  1. Codevs 1159 最大全0子矩阵 悬线法!!!!

    1159 最大全0子矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O ...

  2. 利用input-radio和input-checkbox的表单特性可以节省很多js代码

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. linux多线程学习笔记五--线程安全【转】

    转自:http://blog.csdn.net/kkxgx/article/details/7506085 版权声明:本文为博主原创文章,未经博主允许不得转载. 一,线程安全基础 一个函数被称为线程安 ...

  4. python进阶学习

    python高级用法 github: https://github.com/cq146637/Advanced     

  5. gitlab+gerrit+jenkins

    gitlab-repo 指在 gitlab 上的代码库, gerrit-repo 指在 gerrit 上的代码库: 从 gitlab-repo 上获取代码 本地修改, 提交 push 到 gerrit ...

  6. (5)ASP.NET HttpResponse 类

    HttpResponse 类用来封装来自 ASP.NET 操作的 HTTP 响应信息 https://msdn.microsoft.com/zh-cn/library/system.web.httpr ...

  7. 百度前端开发规范 by fex-team

    github:https://github.com/fex-team/styleguide 离线版本: 链接:http://pan.baidu.com/s/1gfr857l 密码:cvk3 注:只支持 ...

  8. 全面了解Nginx主要应用场景

    http://www.raye.wang/2017/02/24/quan-mian-liao-jie-nginxdao-di-neng-zuo-shi-yao/

  9. html5扫面二维码逻辑

    写在前面 项目中有这样的需求,在android端嵌入的html5应用中,需要扫描二维码,而一般的浏览器是不允许你调用摄像头的.最后时限方式是由app的webview进行扫描,将扫描结果返回,也就是js ...

  10. Android Studio 中.android 文件夹移动默认位置

    转自 开发工具打造: .android 文件夹移动默认位置 .android 文件夹是用来存放 avd 模拟器文件的文件夹. 因为默认是 C盘 的. 占用空间比较大.很不爽 将它移动到其它盘其实很简单 ...