一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java設(shè)計(jì)模式之訪問(wèn)模式(Visitor者模式)介紹

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

2019-12-11 13:42junjie JAVA教程

這篇文章主要介紹了Java設(shè)計(jì)模式之訪問(wèn)模式(Visitor者模式)介紹,本文講解了為何使用Visitor模式、如何使用Visitor模式、使用Visitor模式的前提等內(nèi)容,需要的朋友可以參考下

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

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

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

 

復(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來(lái)判斷 o的類型。

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

如何使用Visitor模式

針對(duì)上例,我們?cè)O(shè)計(jì)一個(gè)接口visitor訪問(wèn)者:

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

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

 

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

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

我們定義這個(gè)接口叫Visitable,用來(lái)定義一個(gè)Accept操作,也就是說(shuō)讓Collection每個(gè)元素具備可訪問(wèn)性。

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

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


好了,有了兩個(gè)接口,我們就要定義他們的具體實(shí)現(xiàn)(Concrete class):

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

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

 

再看看訪問(wèn)者的Concrete實(shí)現(xiàn):

 

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


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

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

使用Visitor模式的前提

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩视频在线观看中字 | 奇米网在线 | 日韩无遮挡大尺度啪啪影片 | 日本高清在线播放一区二区三区 | 奇米社区| 成人性色生活片免费网 | 成年人免费看的视频 | 日本免费精品视频 | 91庥豆果冻天美精东蜜桃传媒 | 亚洲爱v | 给我视频免费看 | 羞羞视频污 | 调教老师肉色丝袜的故事 | 国产chinese男男gaygay | 亚洲欧美成人综合久久久 | 色成人综合网 | 国产成人精品在线观看 | 5g影院天天影院天天爽影院网站 | 日本中文字幕在线观看视频 | 亚洲红怡院 | 免费观看一区二区 | 日本免费在线观看视频 | 欧美日韩视频一区三区二区 | 十六以下岁女子毛片免费 | 色欲麻豆国产福利精品 | 国产亚洲精品一区在线播 | 午夜免费无码福利视频麻豆 | 99视频有精品视频免费观看 | 日韩在线观看网站 | 四虎影院在线免费观看 | 亚洲精品国产成人中文 | 欧美日韩亚洲成人 | 无人在线观看免费高清视频播放 | 男女姓交大视频免费观看 | 亚洲精品国产在线观看 | 福利片福利一区二区三区 | 天堂69亚洲精品中文字幕 | videosxxxx老女人 | 1769最新资源站 | 亚洲国产欧美另类va在线观看 | 18国产精品白浆在线观看免费 |