欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計模式之訪問模式(Visitor者模式)介紹

 更新時間:2015年03月11日 09:09:46   投稿:junjie  
這篇文章主要介紹了Java設(shè)計模式之訪問模式(Visitor者模式)介紹,本文講解了為何使用Visitor模式、如何使用Visitor模式、使用Visitor模式的前提等內(nèi)容,需要的朋友可以參考下

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

在Java中,Visitor模式實際上是分離了collection結(jié)構(gòu)中的元素和對這些元素進行操作的行為。

為何使用Visitor模式
Java的Collection(包括Vector和Hashtable)是我們最經(jīng)常使用的技術(shù),可是Collection好象是個黑色大染缸,本來有各種鮮明類型特征的對象一旦放入后,再取出時,這些類型就消失了。那么我們勢必要用If來判斷,如:

復(fù)制代碼 代碼如下:

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模式

針對上例,我們設(shè)計一個接口visitor訪問者:

復(fù)制代碼 代碼如下:

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

在這個接口中,將我們認(rèn)為Collection有可能的類的類型放入其中。

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

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

復(fù)制代碼 代碼如下:

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

好了,有了兩個接口,我們就要定義他們的具體實現(xiàn)(Concrete class):
復(fù)制代碼 代碼如下:

public class ConcreteElement implements Visitable
{
   private String value;
   public ConcreteElement(String string) {
      value = string;
   }
   //定義accept的具體內(nèi)容 這里是很簡單的一句調(diào)用
   public void accept(Visitor visitor) {
      visitor.visitString(this);
   }
}

再看看訪問者的Concrete實現(xiàn):

復(fù)制代碼 代碼如下:

public class ConcreteVisitor implements Visitor
{
   //在本方法中,我們實現(xiàn)了對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我們實現(xiàn)了對Collection每個元素訪問,只使用了一個判斷語句,只要判斷其是否可以訪問。

至此,我們完成了Visitor模式基本架構(gòu)。

使用Visitor模式的前提

對象群結(jié)構(gòu)中(Collection) 中的對象類型很少改變,也就是說訪問者的身份類型很少改變,如上面中Visitor中的類型很少改變,如果需要增加新的操作,比如上例中我們在ConcreteElement具體實現(xiàn)外,還需要新的ConcreteElement2 ConcreteElement3。

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

如果Visitor也經(jīng)常變化,也就是說,對象群中的對象類型經(jīng)常改變,一般建議是,不如在這些對象類中逐個定義操作,但是Java的Reflect技術(shù)解決了這個問題。

相關(guān)文章

  • 關(guān)于java中可變長參數(shù)的定義及使用方法詳解

    關(guān)于java中可變長參數(shù)的定義及使用方法詳解

    下面小編就為大家?guī)硪黄P(guān)于java中可變長參數(shù)的定義及使用方法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • SpringBoot打印詳細(xì)啟動異常信息

    SpringBoot打印詳細(xì)啟動異常信息

    這篇文章主要介紹了SpringBoot打印詳細(xì)啟動異常信息,本文包含了詳細(xì)的過程解析與案例,概要的說明了如何去使用打印啟動異常信息,需要的朋友可以參考下
    2021-06-06
  • WebSocket整合SSM(Spring,Struts2,Maven)的實現(xiàn)示例

    WebSocket整合SSM(Spring,Struts2,Maven)的實現(xiàn)示例

    這篇文章主要介紹了WebSocket整合SSM(Spring,Struts2,Maven)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Java如何使用字符流讀寫非文本文件

    Java如何使用字符流讀寫非文本文件

    這篇文章主要介紹了Java如何使用字符流讀寫非文本文件,以Java的字符流讀取文件為例:它只能讀取0-65535之間的字符,可以看出來字符都是正數(shù),但是二進制的byte是可以為負(fù)數(shù)的,需要的朋友可以參考下
    2023-04-04
  • Spring MVC返回的json去除根節(jié)點名稱的方法

    Spring MVC返回的json去除根節(jié)點名稱的方法

    這篇文章主要介紹了Spring MVC返回的json去除根節(jié)點名稱的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Java連接mysql數(shù)據(jù)庫的詳細(xì)教程(推薦)

    Java連接mysql數(shù)據(jù)庫的詳細(xì)教程(推薦)

    這篇文章主要介紹了Java連接mysql數(shù)據(jù)庫的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Spring?Bean創(chuàng)建的另一條捷徑

    Spring?Bean創(chuàng)建的另一條捷徑

    這篇文章主要為大家介紹了Spring?Bean創(chuàng)建的另一條方法捷徑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 詳解Java中的不可變對象

    詳解Java中的不可變對象

    這篇文章主要介紹了Java中的不可變對象的相關(guān)知識,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下
    2020-06-06
  • java利用CompletionService保證任務(wù)先完成先獲取到執(zhí)行結(jié)果

    java利用CompletionService保證任務(wù)先完成先獲取到執(zhí)行結(jié)果

    這篇文章主要為大家詳細(xì)介紹了java如何利用CompletionService來保證任務(wù)先完成先獲取到執(zhí)行結(jié)果,文中的示例代碼講解詳細(xì),需要的可以參考下
    2023-08-08
  • java線程池實現(xiàn)批量下載文件

    java線程池實現(xiàn)批量下載文件

    這篇文章主要為大家詳細(xì)介紹了java線程池實現(xiàn)批量下載文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評論