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

首先定义一个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. Linux硬链接和软链接(符号链接)

    硬链接与软连接 :https://blog.csdn.net/u013777351/article/details/50557260 索引节点:https://blog.csdn.net/jessey ...

  2. python(3)-- 语句:条件、循环、break、continue...

    1. 条件语句 执行条件:判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围. [Python程序语言指定任何非0和非空(null)值为true,0 或 ...

  3. 基于webpack搭建vue-cli以及webstorm的设置

    N1.检查本地电脑是否安装node和npm 安装vue-cli的前提是已经安装了npm 是否安装npm检查命令 npm -v 如果出现版本号,说明已经安装了npm 查看node版本号 node -v ...

  4. Eclipse SVN冲突详细解决方案

         大家一起开发,难免有时会同时修改同一个文件,这样就要学会解决冲突.当大家更新代码,发现以下情况的时候,就说明你的修改的文件和服务器的文件产生了冲突(一般是别人也改了同一个文件). 1)和服务 ...

  5. HDU2767 Proving Equivalences

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

  6. myeclipse服务器"未能创建视图:抛出意外异常。"

    找到对应目录 Workspaces\.metadata\.plugins\org.eclipse.core.runtime\.settings 下的 com.genuitec.eclipse.ast. ...

  7. 牛客网 牛客小白月赛1 F.三视图

    F.三视图   链接:https://www.nowcoder.com/acm/contest/85/F来源:牛客网     这个题自己想一下三维的,正视图和左视图中y轴为行数,x轴和z轴是列数,因为 ...

  8. ActiveMQ 权限(二)

    在 ActiveMQ 权限(一) 配置了对消息队列的权限,以下设置完成消息的权限,比如只接受某ip的消息. 两步完成, 第一步:继承接口org.apache.activemq.security.Mes ...

  9. luogu P1345 [USACO5.4]奶牛的电信Telecowmunication

    https://www.luogu.org/problemnew/show/1345 拆点,中间建流量为1的边,跑最小割 #include<cstdio> #include<queu ...

  10. Oracle Linux 6.4(BOND)双网卡绑定实战—附加说明

    操作环境Oracle Linux Server release 6.4内核Linux rac1 2.6.39-400.17.1.el6uek.x86_64 [root@RAC-2 ~]# vi /et ...