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

首先定义一个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. 【HDU 3746 Cyclic Nacklace】

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  2. 【CCF】炉石传说 模拟

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  3. Java EE 学习(1):什么是Java EE

    转载: http://www.jb51.net/article/13059.htm 经常听朋友说什么J2EE,终于知道点什么是J2EE了,汗一个,上网搜了下这个说的比较详细了,J2EE,Java2平台 ...

  4. 支线剧情(bzoj 3876)

    Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...

  5. 批量保存 htm

    公司项目,需要对一个列表做批量保存到Doc的功能. 后来通过架构人员协助,采用MemoryStream二进制流的方式保存为htm文档. 然后通过第3方的dll,ICSharpCode.SharpZip ...

  6. DataSet导出Excel,比以往的方法导出的Excel外观更加好看

    原文发布时间为:2010-06-21 -- 来源于本人的百度文章 [由搬家工具导入] ======目前方法=========== #region 生成Excel/// <summary>/ ...

  7. wap开发杂项1

    原文发布时间为:2010-08-31 -- 来源于本人的百度文章 [由搬家工具导入] wap开发全程记忆[CLQ原创 持续更新] 1. 据说手机wap最好都是utf-8字符集,不过gb2312对移动手 ...

  8. echarts源码中关于 判断平台的有用代码

    function detect(ua) { var os = {}; var browser = {}; // var webkit = ua.match(/Web[kK]it[\/]{0,1}([\ ...

  9. Python 多核 多线程 调度

    参考: http://www.oschina.net/translate/pythons-hardest-problem https://news.ycombinator.com/item?id=58 ...

  10. apscheduler定时器

    每天定时任务: import time from apscheduler.schedulers.background import BackgroundScheduler def foo(): pri ...