文档章节

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

奋斗到天明
 奋斗到天明
发布于 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
设计模式之五大创建型模式

一、概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 (2)结构型模式,共七种:适配器模式、装饰器模式、代理...

小城故事_
2016/03/19
53
0
一句话总结23种设计模式则

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

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

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

viakiba
2016/11/29
22
0
设计模式之11个行为型模式

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

randy_shandong
2017/01/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 你是靠自己努力才失败的

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 小小编辑:推荐歌曲 《Raveena》- Raveena 《Raveena》- Raveena 手机党少年们想听歌,请使劲儿戳(这里) 11月18日,俞敏洪在某论坛演讲中称...

小小编辑
46分钟前
177
6
firewalld

1. firewalld 是什么 CentOS中默认是有 firewalld, iptables, etablesd firewalld 是 CentOS7/RadHat7 中默认的防火墙管理工具. firewalld 工具用来管理里netfilter, 不过底层还是调用的还是...

Fc丶
今天
2
0
Java 源代码和 C 源代码的运行区别

与其他程序的执行方式和编译方式不同。 Java 源代码需要进行编译成字节码后在 Java 虚拟机上运行,这样 Java 程序能够保持独立性和跨平台功特性。 请参考下图。 https://www.cwiki.us/pages...

honeymose
今天
6
0
Apache限定目录解析PHP,限制user_agent,PHP相关的配置

Apache限定目录解析PHP 配置前访问upload/index.php [root@test-a ~]# curl -x192.168.77.139:80 'www.test.com/upload/index.php'This is upload diretory 配置,/usr/local/apache2.4/......

野雪球
今天
6
0
java.util.Concurrent.Exchanger源码

类图 源码: package java.util.concurrent;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent......

狼王黄师傅
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部