雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

Java編程

當(dāng)前位置:主頁 > 軟件編程 > Java編程 >

舉例講解設(shè)計模式中的訪問者模式在Java編程中的運(yùn)用

來源:本站原創(chuàng)|時間:2020-01-10|欄目:Java編程|點擊:

訪問者(Visitor)模式:封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)中的各元素的操作,它可以在不改變這個數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作。訪問者模式的結(jié)構(gòu)圖如下:

通過上圖可以看到他有如下角色:
抽象訪問者(Visitor)角色:定義接口,聲明一個或多個訪問操作。
具體訪問者(ConcreteVisitor)角色:實現(xiàn)抽象訪問者所聲明的接口,也就是抽象訪問者所聲明的各個訪問操作。
抽象元素(Visitable)角色:聲明一個接受操作,接受一個訪問者對象作為一個參數(shù)。
具體元素結(jié)點(ConcreteElement)角色:實現(xiàn)抽象結(jié)點所規(guī)定的接受操作。
數(shù)據(jù)結(jié)構(gòu)對象(ObjectStructure)角色:可以遍歷結(jié)構(gòu)中的所有元素,提供一個接口讓訪問者對象都可以訪問每一個元素。
模擬代碼如下:

interface Visitor { 
  void visit(Gladiolus g); 
 
  void visit(Chrysanthemum c); 
} 

// concrete visitor   名稱訪問 
class StringVisitor implements Visitor { 
  String s; 
 
  public String toString() { 
    return s; 
  } 
 
  public void visit(Gladiolus g) { 
    s = "Gladiolus"; 
  } 
 
  public void visit(Chrysanthemum c) { 
    s = "Chrysanthemum"; 
  } 
} 

 

// concrete visitor   蜜蜂訪問 
class BeeVisitor implements Visitor { 
  public void visit(Gladiolus g) { 
    System.out.println("蜜蜂 來 訪問 Gladiolus"); 
  } 
 
  public void visit(Chrysanthemum c) { 
    System.out.println("蜜蜂 來 訪問 Chrysanthemum"); 
  } 
} 
 
interface Flower { 
  void accept(Visitor v); 
} 

 

/* 
 * concrete element   菊花 
 */ 
class Chrysanthemum implements Flower { 
  public void accept(Visitor v) { 
    v.visit(this); 
  } 
} 

 

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

 

//這是Flower一個對象生成器 
class FlowerGenerator { 
  private static Random rand = new Random(); 
 
  public static Flower newFlower() { 
    switch (rand.nextInt(2)) { 
    default: 
    case 0: 
      return new Gladiolus(); 
    case 1: 
      return new Chrysanthemum(); 
    } 
  } 
} 
public class Test { 
  /* 
   * 首先在客戶端先獲得一個具體的訪問者角色 遍歷對象結(jié)構(gòu) 對每一個元素調(diào)用accept方法,將具體訪問者角色傳入 這樣就完成了整個過程 
   */ 
  public static void main(String args[]) { 
    List<Flower> flowers = new ArrayList<Flower>(); 
    for (int i = 0; i < 10; i++) 
      flowers.add(FlowerGenerator.newFlower()); 
    Visitor visitor = new StringVisitor(); 
    Iterator<Flower> iterator = flowers.iterator(); 
    while (iterator.hasNext()) { 
      iterator.next().accept(visitor); 
      System.out.println(visitor); 
    } 
    System.out.println("---------------"); 
    /* 
     * 一個新的訪問行為 :BeeVisitor 蜜蜂訪問 
     */ 
    Visitor visitor2 = new BeeVisitor(); 
    for (Flower flower : flowers) { 
      flower.accept(visitor2); 
    } 
 
  } 
} 

結(jié)果:

Gladiolus 
Chrysanthemum 
Chrysanthemum 
Gladiolus 
Chrysanthemum 
Chrysanthemum 
Chrysanthemum 
Chrysanthemum 
Gladiolus 
Gladiolus 
--------------- 
蜜蜂 來 訪問 Gladiolus 
蜜蜂 來 訪問 Chrysanthemum 
蜜蜂 來 訪問 Chrysanthemum 
蜜蜂 來 訪問 Gladiolus 
蜜蜂 來 訪問 Chrysanthemum 
蜜蜂 來 訪問 Chrysanthemum 
蜜蜂 來 訪問 Chrysanthemum 
蜜蜂 來 訪問 Chrysanthemum 
蜜蜂 來 訪問 Gladiolus 
蜜蜂 來 訪問 Gladiolus 

有以下情形可以考慮使用訪問者模式:

1、一個對象結(jié)構(gòu)包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴于其具體類的操作。
2、需要對一個對象結(jié)構(gòu)中的對象進(jìn)行很多不同的并且不相關(guān)的操作,而你想避免讓這些操作“污染”這些對象的類。Visitor使得你可以將相關(guān)的操作集中起來定義在一個類中。
3、當(dāng)該對象結(jié)構(gòu)被很多應(yīng)用共享時,用Visitor模式讓每個應(yīng)用僅包含需要用到的操作。
4、 定義對象結(jié)構(gòu)的類很少改變,但經(jīng)常需要在此結(jié)構(gòu)上定義新的操作。改變對象結(jié)構(gòu)類需要重定義對所有訪問者的接口,這可能需要很大的代價。如果對象結(jié)構(gòu)類經(jīng)常改變,那么可能還是在這些類中定義這些操作較好。
這些個人看來都是建議,項目中還要具體問題具體分析了。
 

上一篇:Java 回調(diào)函數(shù)詳解及使用

欄    目:Java編程

下一篇:Apache Camel的Java編程入門指南

本文標(biāo)題:舉例講解設(shè)計模式中的訪問者模式在Java編程中的運(yùn)用

本文地址:http://www.jygsgssxh.com/a1/Javabiancheng/8474.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有