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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - JAVA教程 - 舉例講解設計模式中的訪問者模式在Java編程中的運用

舉例講解設計模式中的訪問者模式在Java編程中的運用

2020-04-25 15:41匆忙擁擠repeat JAVA教程

這篇文章主要介紹了舉例講解設計模式中的訪問者模式在Java編程中的運用,訪問者模式是一種將算法與對象結構分離的軟件設計模式,需要的朋友可以參考下

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

舉例講解設計模式中的訪問者模式在Java編程中的運用

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

?
1
2
3
4
5
interface Visitor {
  void visit(Gladiolus g);
 
  void visit(Chrysanthemum c);
}

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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";
  }
}

 

?
1
2
3
4
5
6
7
8
9
10
11
// concrete visitor   蜜蜂訪問
class BeeVisitor implements Visitor {
  public void visit(Gladiolus g) {
    System.out.println("蜜蜂 來 訪問 Gladiolus");
  }
 
  public void visit(Chrysanthemum c) {
    System.out.println("蜜蜂 來 訪問 Chrysanthemum");
  }
}
?
1
2
3
interface Flower {
  void accept(Visitor v);
}

 

?
1
2
3
4
5
6
7
8
/*
 * concrete element   菊花
 */
class Chrysanthemum implements Flower {
  public void accept(Visitor v) {
    v.visit(this);
  }
}

 

?
1
2
3
4
5
6
// concrete element   劍蘭
class Gladiolus implements Flower {
  public void accept(Visitor v) {
    v.visit(this);
  }
}

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//這是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();
    }
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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);
    }
 
  }
}

結果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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、 定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。如果對象結構類經常改變,那么可能還是在這些類中定義這些操作較好。
這些個人看來都是建議,項目中還要具體問題具體分析了。
 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美黑人性猛交╳xx╳动态图 | 热色综合| 欧美日韩第二页 | 黄漫在线播放 | 久热人人综合人人九九精品视频 | 天天做天天爱天天一爽一毛片 | 国产资源在线视频 | 美女机机对机机的视频(免费) | 国产自产2023最新麻豆 | 成年人免费观看的视频 | 国产v日韩v欧美v精品专区 | 亚洲系列国产系列 | 91对白在线 | 天堂欧美 | 大ji吧快给我别停受不了视频 | yellow在线| 亚洲精品免费视频 | 青青草国产精品久久碰 | 调教麻麻成贱m | 亚洲va久久久久 | 午夜伦理 第1页 | 欧美日韩高清观看一区二区 | 色欧美亚洲 | 男女天堂 | 91调教| 幻女free性俄罗斯第一次摘花 | 成人影院在线看 | 暖暖的韩国免费观看 | 国产三级精品三级男人的天堂 | 俄罗斯图书馆无打码久久 | 日本护士撒尿xxxxhd | 91原创国产 | 日本网络视频www色高清免费 | zol中关村在线官网 yy6080欧美三级理论 | 国产成人精品一区二三区在线观看 | 日本亚欧乱色视频在线观看 | 欧美在线国产 | 91精品国产免费久久国语蜜臀 | 亚洲福利二区 | 四虎影库网址 | 国产卡一卡二卡3卡乱码免费 |