`

設計模式之Visitor

F# 
阅读更多

Visitor 定義
作用於某個物件群中各個物件的操作。 它可以使你在不改變這些物件本身的情況下 , 定義作用於這些物件的新操作。

Java ,Visitor 模式實際上是分離了 collection 結構中的元素和對這些元素進行操作的行爲。

爲何使用 Visitor?
Java
Collection( 包括 Vector Hashtable) 是我們最經常使用的技術 , 可是 Collection 好象是個黑色大染缸 , 本來有各種鮮明類型特徵的物件一旦放入後 , 再取出時 , 這些類型就消失了。那麽我們勢必要用 If 來判斷 , :


Iterator iterator = collection.iterator()
while (iterator.hasNext()) {
  
Object o = iterator.next();
  
if (o instanceof Collection)
     
messyPrintCollection((Collection)o);
  
else if (o instanceof String)
     
System.out.println("'"+o.toString()+"'");
  
else if (o instanceof Float)
     
System.out.println(o.toString()+"f");
  
else
     
System.out.println(o.toString());
}
在上例中 , 我們使用了 instanceof 來判斷 o 的類型。

很顯然 , 這樣做的缺點代碼 If else if 很繁瑣。我們就可以使用 Visitor 模式解決它。

如何使用 Visitor?
針對上例 , 我們設計一個介面 visitor 訪問者 :

public interface Visitor
{
  
public void visitCollection(Collection collection);
  
public void visitString(String string);
   public void visitFloat(Float float);
}

在這個介面中 , 將我們認爲 Collection 有可能的類別的類型放入其中。

有了訪問者 , 我們需要被訪問者 , 被訪問者就是我們 Collection 的每個元素 Element, 我們要爲這些 Element 定義一個可以接受訪問的介面 ( 訪問和被訪問是互動的 , 只有訪問者 , 被訪問者如果表示不歡迎 , 訪問者就不能訪問 ),

我們定義這個介面叫 Visitable, 用來定義一個 Accept 操作 , 也就是說讓 Collection 每個元素具備可訪問性。

public interface Visitable
{
   public void accept(Visitor visitor);
}

好了 , 有了兩個介面 , 我們就要定義他們的具體實現 (Concrete class):

public class ConcreteElement implements Visitable
{
  
private String value;
  
public ConcreteElement(String string) {
     
value = string;
  
}
   // 定義 accept 的具體內容 這裏是很簡單的一句呼叫
  
public void accept(Visitor visitor) {
     
visitor.visitString(this);
   }
}

再看看訪問者的 Concrete 實現 :

public class ConcreteVisitor implements Visitor
{
   // 在本方法中 , 我們實現了對 Collection 的元素的成功訪問
  
public void visitCollection(Collection collection) {
     
Iterator iterator = collection.iterator()
     
while (iterator.hasNext()) {
        
Object o = iterator.next();
        
if (o instanceof Visitable)
           
((Visitable)o).accept(this);
      }

   public void visitString(String string) {
     
System.out.println("'"+string+"'");
   }

   public void visitFloat(Float float) {
     
System.out.println(float.toString()+"f");
   }
}

?

在上面的 visitCollection 我們實現了對 Collection 每個元素訪問 , 只使用了一個判斷語句 , 只要判斷其是否可以訪問。

至此 , 我們完成了 Visitor 模式基本架構。

使用 Visitor 模式的前提
物件群結構中 (Collection) 中的物件類型很少改變 , 也就是說訪問者的身份類型很少改變 , 如上面中 Visitor 中的類型很少改變 , 如果需要增加新的操作 , 比如上例中我們在 ConcreteElement 具體實現外 , 還需要新的 ConcreteElement2 ConcreteElement3

可見使用 Visitor 模式是有前提的 , 在兩個介面 Visitor Visitable , 確保 Visitor 很少變化 , 變化的是 Visitable, 這樣使用 Visitor 最方便。

如果 Visitor 也經常變化 , 也就是說 , 物件群中的物件類型經常改變 , 一般建議是 , 不如在這些物件類別中逐個定義操作。但是 Java Reflect 技術解決了這個問題。

Reflect 技術是在運行期間動態獲取物件類型和方法的一種技術 ,

分享到:
评论

相关推荐

    C#设计模式之Visitor

    **C#设计模式之Visitor** **一、设计模式概述** 设计模式是软件开发中的经验总结,它提供了解决常见问题的可复用解决方案。在C#编程中,设计模式可以帮助我们编写更灵活、可扩展和易于维护的代码。"Visitor"(访问...

    JAVA设计模式chm文档

    创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) ...设计模式之Visitor

    Java设计模式 设计模式介绍

    章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立...10、设计模式之State 11、设计模式之Facade(外观) 12、设计模式之Interpreter(解释器) 13、设计模式之Visitor

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

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...

    设计模式文档 chm

    设计模式参考文档 创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) ...设计模式之Visitor

    设计模式系列之visitor

    "设计模式系列之visitor"是一个关于软件设计模式的讨论,特别是关注于“访问者”(Visitor)模式。这个模式是GOF(Gamma, Helm, Johnson, Vlissides)在他们的经典著作《设计模式:可复用面向对象软件的基础》中提出...

    C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例

    本文实例讲述了C#设计模式之Visitor访问者模式解决长隆欢乐世界问题。分享给大家供大家参考,具体如下: 一、理论定义 访问者模式 提供了 一组 集合 对象 统一的 访问接口,适合对 一个集合中的对象,进行逻辑操作,...

    二十三种设计模式【PDF版】

    设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. 设计模式引言 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相关的对象,以适当的粒度将...

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

    访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时也允许独立地改变元素类和访问者类...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

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

    **访问者模式(Visitor Pattern)**是一种行为设计模式,它提供了一种在不修改对象结构的情况下增加新操作的方法。这种模式的主要思想是将数据结构与算法分离,使得算法可以在不改变对象结构的情况下独立变化。 在...

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

    ### C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 #### 概述 在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一...

    试试visitor设计模式

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

    24种设计模式以及混合设计模式

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...

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

    1. **Visitor模式**:这是一个行为设计模式,它允许在不改变元素类的情况下,为对象结构中的元素添加新的操作。在本项目中,Visitor模式被用来处理表达式树的节点。一个`Expression`接口或类定义了接受访问者的操作...

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

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式的核心思想是分离了算法和对象结构,使得算法可以在不改变对象结构的情况下独立变化。 访问者...

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

Global site tag (gtag.js) - Google Analytics