程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 舉例講授設計形式中的拜訪者形式在Java編程中的應用

舉例講授設計形式中的拜訪者形式在Java編程中的應用

編輯:關於JAVA

舉例講授設計形式中的拜訪者形式在Java編程中的應用。本站提示廣大學習愛好者:(舉例講授設計形式中的拜訪者形式在Java編程中的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例講授設計形式中的拜訪者形式在Java編程中的應用正文


拜訪者(Visitor)形式:封裝一些感化於某種數據構造中的各元素的操作,它可以在不轉變這個數據構造的條件下界說感化於這些元素的新的操作。拜訪者形式的構造圖以下:

經由過程上圖可以看到他有以下腳色:
籠統拜訪者(Visitor)腳色:界說接口,聲明一個或多個拜訪操作。
詳細拜訪者(ConcreteVisitor)腳色:完成籠統拜訪者所聲明的接口,也就是籠統拜訪者所聲明的各個拜訪操作。
籠統元素(Visitable)腳色:聲明一個接收操作,接收一個拜訪者對象作為一個參數。
詳細元素結點(ConcreteElement)腳色:完成籠統結點所劃定的接收操作。
數據構造對象(ObjectStructure)腳色:可以遍歷構造中的一切元素,供給一個接口讓拜訪者對象都可以拜訪每個元素。
模仿代碼以下:

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 { 
  /* 
   * 起首在客戶端先取得一個詳細的拜訪者腳色 遍歷對象構造 對每個元素挪用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); 
    } 
 
  } 
} 

成果:

Gladiolus 
Chrysanthemum 
Chrysanthemum 
Gladiolus 
Chrysanthemum 
Chrysanthemum 
Chrysanthemum 
Chrysanthemum 
Gladiolus 
Gladiolus 
--------------- 
蜜蜂 來 拜訪 Gladiolus 
蜜蜂 來 拜訪 Chrysanthemum 
蜜蜂 來 拜訪 Chrysanthemum 
蜜蜂 來 拜訪 Gladiolus 
蜜蜂 來 拜訪 Chrysanthemum 
蜜蜂 來 拜訪 Chrysanthemum 
蜜蜂 來 拜訪 Chrysanthemum 
蜜蜂 來 拜訪 Chrysanthemum 
蜜蜂 來 拜訪 Gladiolus 
蜜蜂 來 拜訪 Gladiolus 

有以下情況可以斟酌應用拜訪者形式:

1、一個對象構造包括許多類對象,它們有分歧的接口,而你想對這些對象實行一些依附於其詳細類的操作。
2、須要對一個對象構造中的對象停止許多分歧的而且不相干的操作,而你想防止讓這些操作“淨化”這些對象的類。Visitor使得你可以將相干的操作集中起來界說在一個類中。
3、當該對象構造被許多運用同享時,用Visitor形式讓每一個運用僅包括須要用到的操作。
4、 界說對象構造的類很少轉變,但常常須要在此構造上界說新的操作。轉變對象構造類須要重界說對一切拜訪者的接口,這能夠須要很年夜的價值。假如對象構造類常常轉變,那末能夠照樣在這些類中界說這些操作較好。
這些小我看來都是建議,項目中還要詳細成績詳細剖析了。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved