`
Jameslyy
  • 浏览: 386035 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Visitor模式

阅读更多

        Visitor模式,在不修改已有程序结构的前提下,通过添加额外的“访问者”来完成对已有代码功能的提升。

        Visitor模式的组成结构:

  1) 访问者角色(Visitor):声明一个访问接口。接口的名称和方法的参数标识了向访问者发送请求的元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。

  2) 具体访问者角色(Concrete Visitor):实现访问者角色(Visitor)接口

  3) 元素角色(Element):定义一个Accept操作,它以一个访问者为参数。

  4) 具体元素角色(Concrete Element):实现元素角色(Element)接口。

  5) 对象结构角色(Object Structure):这是使用Visitor模式必须的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口允许访问者角色访问它的元素;可以是一个组合(组合模式)或是一个集合,如一个列表或一个无序集合。

  类图如下:

代码例子:
interface Visitor {
 void visit(Gladiolus g);
 void visit(Runuculus r);
 void visit(Chrysanthemum c);
}

interface Flower {
 void accept(Visitor v);
}

// concrete element
class Gladiolus implements Flower {
 public void accept(Visitor v) { v.visit(this);}
}

class Runuculus implements Flower {
 public void accept(Visitor v) { v.visit(this);}
}

class Chrysanthemum implements Flower {
 public void accept(Visitor v) { v.visit(this);}
}

// concrete visitor
class StringVal implements Visitor {
 String s;
 public String toString() { return s; }
 public void visit(Gladiolus g) {
  s = "Gladiolus";
 }

 public void visit(Runuculus r) {
  s = "Runuculus";
 }

 public void visit(Chrysanthemum c) {
  s = "Chrysanthemum";
 }
}

// concrete visitor
class Bee implements Visitor {
 public void visit(Gladiolus g) {
  System.out.println("Bee and Gladiolus");
 }

 public void visit(Runuculus r) {
  System.out.println("Bee and Runuculus");
 }

 public void visit(Chrysanthemum c) {
  System.out.println("Bee and Chrysanthemum");
 }
}

//这是一个对象生成器
class FlowerGenerator {
 private static Random rand = new Random();
 public static Flower newFlower() {
  switch(rand.nextInt(3)) {
  default:
   case 0: return new Gladiolus(); 
   case 1: return new Runuculus();
   case 2: return new Chrysanthemum();
  }
 }
}

//客户测试程序
public class BeeAndFlowers extends TestCase {

 /*
  首先在客户端先获得一个具体的访问者角色
  遍历对象结构
  对每一个元素调用accept方法,将具体访问者角色传入
  这样就完成了整个过程
 */
 List flowers = new ArrayList();
 public BeeAndFlowers() {
  for(int i = 0; i < 10; i++)
   flowers.add(FlowerGenerator.newFlower());
 }

 Visitor sval ;
 public void test() {
  sval = new StringVal();
  Iterator it = flowers.iterator();
  while(it.hasNext()) {
   ((Flower)it.next()).accept(sval);
   System.out.println(sval);
  }
 }

 public static void main(String args[]) {
  junit.textui.TestRunner.run(BeeAndFlowers.class);
 }

}

分享到:
评论

相关推荐

    Visitor模式Visitor模式

    Visitor模式.docVisitor模式.doc

    C++ Visitor模式

    23种设计模式之二十(行为模式)Visitor模式

    设计模式C++学习之访问者模式(Visitor)

    设计模式C++学习之访问者模式(Visitor)

    试试visitor设计模式

    也许最开始出现这种模式,是因为另外的原因: 我有一堆数据放在一个库里头,不想让其它人拿着, 如果你要用数据干活,那你就把函数指针给我,我来替你使用这个数据。...然后人们就说,这是visitor模式。

    基于visitor模式和访问者模式的表达式树_求值引擎

    面向对象 北工大 课设 使用多种设计模式,实现的求值引擎,包括表达式树的构建

    decaf-lang#decaf-book-spec#visitor模式1

    rust中当然也可以有visitor模式这样的东西,比如

    设计模式之访问者模式(Visitor)

    访问者模式(Visitor) 用意:适用于数据结构相对未定的系统,把数据结构和作用于结构上的操作间的耦合解开。

    C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式

    C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式

    36种最新设计模式整理

    Visitor 模式 Guarded Suspension 模式 Producer Consumer 模式 Worker Thread 模式 Thread-Per-Message 模式 Future 模式 Read-Write-Lock 模式 Two-phase Termination 模式 Thread-Specific Storage...

    设计模式精解-GoF 23种设计模式解析

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码 目 录 引 言 0.1 设计模式解析(总序) ...3.8 Visitor模式 3.9 Chain of Responsibility模式 3.10 Iterator模式 3.11 Interpreter模式 4 说明

    Java 的双重分发与 Visitor 模式实例详解

    主要介绍了Java 的双重分发与 Visitor 模式实例详解,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    设计模式可复用面向对象软件的基础.zip

    2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 ...

    C#设计模式.PDF

    四、 一个实际应用Visitor模式的例子 198 五、 在什么情况下应当使用访问者模式 202 六、 使用访问者模式的优点和缺点 203 设计模式(21)-Template Method Pattern 204 一、 模板方法(Template Method)模式 204 ...

    设计模式--C++

    5.11 VISITOR(访问者)—对象行为型模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 5.12.4 对发送者和接收者解耦 229 5.12.5 总结 231 第 6 ...

    GOLF设计模式(C++语言版)

    2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型...

    设计模式(.PDF)

    2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 ...

    C#设计模式大全

    四、 一个实际应用Visitor模式的例子 五、 在什么情况下应当使用访问者模式 六、 使用访问者模式的优点和缺点 设计模式(21)-Template Method Pattern 一、 模板方法(Template Method)模式 二、 模版方法...

    《设计模式》中文版(23个设计模式的介绍与运用)

    2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 ...

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

    2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 ...

Global site tag (gtag.js) - Google Analytics