文档章节

行为型模式之五:访问者模式

奋斗到天明
 奋斗到天明
发布于 2015/08/27 17:40
字数 433
阅读 23
收藏 0

访问者模式通常使用在编译器中的解析器中,像Eclipse中JDT AST PARER。 基本上,一个访问者模式中有两个接口,访问者与元素。

访问者故事

有一个初次访问者来到纽约。他想访问这个城市,城市接受他的访问,一旦他开始访问,就会自动访问所有的东西,他可能不要调用方法,当他相去博物馆,旅行是全包的!

访问者模式的类图

访问者模式的步骤

类图显示了访问的步骤

   

处理流程如下 

1,一个 FirstTimeVisitor和City元素被创建。 

2,程序开始,输出“City accept a visitor”。 

3,City中定义的接受方法让访问者开始访问。 

4,接受访问者,调用覆盖的vist去访问城市。

访问者Java代码

import java.util.ArrayList;
 
interface Visitor {
  public void visit(City city);
  public void visit(Museum museum);
  public void visit(Park park);
}
 
class FirstTimeVisitor implements Visitor {
 
  @Override
  public void visit(City city) {
    System.out.println("I'm visiting the city!");
  }
 
  @Override
  public void visit(Museum museum) {
    System.out.println("I'm visiting the Museum!");
  }
 
  @Override
  public void visit(Park park) {
    System.out.println("I'm visiting the Park!");
  }
}
 
interface Element {
  public void accept(Visitor visitor);
}
 
class City implements Element {
 
  ArrayList places = new ArrayList();
 
  public City() {
    places.add(new Museum());
    places.add(new Park());
  }
 
  @Override
  public void accept(Visitor visitor) {
    System.out.println("City is accepting visitor.");
    visitor.visit(this);
 
    for (Element e : places) {
      e.accept(visitor);
    }
  }
}
 
class Museum implements Element {
  @Override
  public void accept(Visitor visitor) {
    System.out.println("Museum is accepting visitor.");
    visitor.visit(this);
  }
}
 
class Park implements Element {
  @Override
  public void accept(Visitor visitor) {
    System.out.println("Park is accepting visitor.");
    visitor.visit(this);
  }
 
}
 
public class TestVisitor {
  public static void main(String[] args) {
    FirstTimeVisitor visitor = new FirstTimeVisitor();
    City city = new City();
    city.accept(visitor);
  }
}

输出

City is accepting visitor.
I'm visiting the city!
Museum is accepting visitor.
I'm visiting the Museum!
Park is accepting visitor.
I'm visiting the Park!

Visitor模式在JDK中

javax.lang.model.element.AnnotationValue 显然使用了访问者模式,但是他不是常规项目使用项。

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
小菜学设计模式——设计模式总结之行为型(2)

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/10
137
0
设计模式之11个行为型模式

行为型模式概述 行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。 行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。 通过行为型模式,可...

randy_shandong
2017/01/12
0
0
设计模式(行为型模式)——访问者模式(Visitor)

访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数...

小风89
2016/07/21
24
0
一句话总结23种设计模式则

1. 前言 断断续续写了一段时间的设计模式,终于把经典的23种设计模式全写完了。下面对这些设计模式总结一下。 2. 设计原则 设计原则的介绍 : 设计模式的六大原则 即使我们之前没有专门看过这...

四月葡萄
01/05
0
0
设计模式:行为型模式(2)

19、备忘录模式(Memento) 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属...

viakiba
2016/11/29
22
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
2
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部