設計模式之Visitor

原创 2004年06月24日 20:13:00

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

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

爲何使用Visitor?
Java
Collection(包括VectorHashtable)是我們最經常使用的技術,可是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模式是有前提的,在兩個介面VisitorVisitable,確保Visitor很少變化,變化的是Visitable,這樣使用Visitor最方便。

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

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

ANDROID 中设计模式的采用--创建型模式

模式在某一情景下解决某个问题的固定解决方案。 所有的创建型模式都是用作解决对象的创建或实例化问题的解决方案。 1  简单工厂模式 创建对象的最简单方法是使用new来创建一个对象,如果只创建一种固...
  • GooHong
  • GooHong
  • 2014年07月22日 16:39
  • 2715

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

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...
  • cooldragon
  • cooldragon
  • 2016年08月12日 12:10
  • 3777

JAVA设计模式之 访问者模式【Visitor Pattern】

一、概述     访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。在使用访问者...
  • l416112167
  • l416112167
  • 2014年11月15日 22:21
  • 3253

C#设计模式之Visitor

  • 2007年11月08日 16:36
  • 20KB
  • 下载

试试visitor设计模式

  • 2012年12月13日 19:58
  • 7KB
  • 下载

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

  • 2012年03月10日 08:42
  • 27KB
  • 下载

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

  • 2011年07月07日 09:40
  • 13KB
  • 下载

java设计模式之Visitor

转自:http://it.china-b.com/java/ggjc/20100131/188863_1.html Visitor定义 作用于某个对象群中各个对象的操作. 它可以使你在不改变这...
  • hu_shengyang
  • hu_shengyang
  • 2011年09月05日 17:05
  • 780

设计模式笔记-SINGLETON-VISITOR-OBSERVER等等等

感觉设计模式如果没有见过就直接看他的描述,很难懂。 SINGLETON以前在别人的代码里见过,稍微一看这个模式就明白什么意思了。当然这也是一个比较简单的模式 看完书上的介绍之后,有这么几点体会。 本质...
  • solofly752
  • solofly752
  • 2015年04月08日 10:02
  • 552

C++设计模式Visitor+Iterator简单实现

#include #include #include class ElementA; class CompositeElement; template class MyList; template c...
  • owengbs
  • owengbs
  • 2013年09月11日 11:30
  • 1069
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:設計模式之Visitor
举报原因:
原因补充:

(最多只允许输入30个字)