麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JAVA基礎(chǔ):深入淺出Java的訪問者模式

2019-11-18 13:34:03
字體:
供稿:網(wǎng)友

一、引子

  對(duì)于系統(tǒng)中一個(gè)已經(jīng)完成的類層次結(jié)構(gòu),我們已經(jīng)給它提供了滿足需求的接口。但是面對(duì)新增加的需求,我們應(yīng)該怎么做呢?假如這是為數(shù)不多的幾次變動(dòng),而且你不用為了一個(gè)需求的調(diào)整而將整個(gè)類層次結(jié)構(gòu)統(tǒng)統(tǒng)地修改一遍,那么直接在原有類層次結(jié)構(gòu)上修改也許是個(gè) 不錯(cuò) 的主意。

  但是往往我們碰到的卻是:這樣的需求變動(dòng)也許會(huì)不停的發(fā)生;更重要的是需求的任何變動(dòng)可能都要讓你將整個(gè)類層次結(jié)構(gòu)修改個(gè)底朝天……。這種類似的操作分布在不同的類里面,不是一個(gè)好現(xiàn)象,我們要對(duì)這個(gè)結(jié)構(gòu)重構(gòu)一下了。

  那么,訪問者模式也許是你很好的選擇。

  二、定義與結(jié)構(gòu)

  訪問者模式,顧名思義使用了這個(gè)模式后就可以在不修改已有程序結(jié)構(gòu)的前提下,通過添加額外的“訪問者”來完成對(duì)已有代碼功能的提升。

  《設(shè)計(jì)模式》一書對(duì)于訪問者模式給出的定義為:表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。從定義可以看出結(jié)構(gòu)對(duì)象是使用訪問者模式必須條件,而且這個(gè)結(jié)構(gòu)對(duì)象必須存在遍歷自身各個(gè)對(duì)象的方法。這便類似于java中的collection概念了。

  以下是訪問者模式的組成結(jié)構(gòu):

  1) 訪問者角色(Visitor):為該對(duì)象結(jié)構(gòu)中具體元素角色聲明一個(gè)訪問操作接口。該操作接口的名字和參數(shù)標(biāo)識(shí)了發(fā)送訪問請(qǐng)求給具體訪問者的具體元素角色。這樣訪問者就可以通過該元素角色的特定接口直接訪問它。

  2) 具體訪問者角色(Concrete Visitor):實(shí)現(xiàn)每個(gè)由訪問者角色(Visitor)聲明的操作。

  3) 元素角色(Element):定義一個(gè)Accept操作,它以一個(gè)訪問者為參數(shù)。

  4) 具體元素角色(Concrete Element):實(shí)現(xiàn)由元素角色提供的Accept操作。

  5) 對(duì)象結(jié)構(gòu)角色(Object StrUCture):這是使用訪問者模式必備的角色。它要具備以下特征:能枚舉它的元素;可以提供一個(gè)高層的接口以答應(yīng)該訪問者訪問它的元素;可以是一個(gè)復(fù)合(組合模式)或是一個(gè)集合,如一個(gè)列表或一個(gè)無序集合。

  來張類圖就能更加清楚的看清訪問者模式的結(jié)構(gòu)了。



  那么像引言中假想的。我們應(yīng)該做些什么才能讓訪問者模式跑起來呢?首先我們要在原有的類層次結(jié)構(gòu)中添加accept方法。然后將這個(gè)類層次中的類放到一個(gè)對(duì)象結(jié)構(gòu)中去。這樣再去創(chuàng)建訪問者角色……

  三、舉例

  本人閱歷實(shí)在可憐,沒能找到訪問者模式在實(shí)際應(yīng)用中的例子。只好借《Thinking in Patterns with java》中的教學(xué)代碼一用。我稍微做了下修改。

import java.util.*; 
import junit.framework.*;

//訪問者角色

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

// The Flower hierarchy cannot be changed:
//元素角色

interface Flower {
 void accept(Visitor v);
}

//以下三個(gè)具體元素角色

class Gladiolus implements Flower {
 public void accept(Visitor v) { v.visit(this);}
}

class Runuculus implements Flower {
 public void accept(Visitor v) { v.visit(this);}
}

class Chrysanthemum implements Flower {
 public void accept(Visitor v) { v.visit(this);}
}

// Add the ability to PRoduce a string:
//實(shí)現(xiàn)的具體訪問者角色

class StringVal implements Visitor {
 String s;
 public String toString() { return s; }
 public void visit(Gladiolus g) {
  s = "Gladiolus";
 }

 public void visit(Runuculus r) {
  s = "Runuculus";
 }

 public void visit(Chrysanthemum c) {
  s = "Chrysanthemum";
 }
}

// Add the ability to do "Bee" activities:
//另一個(gè)具體訪問者角色

class Bee implements Visitor {
 public void visit(Gladiolus g) {
  System.out.println("Bee and Gladiolus");
 }

 public void visit(Runuculus r) {
  System.out.println("Bee and Runuculus");
 }

 public void visit(Chrysanthemum c) {
  System.out.println("Bee and Chrysanthemum");
 }
}

//這是一個(gè)對(duì)象生成器
//這不是一個(gè)完整的對(duì)象結(jié)構(gòu),這里僅僅是模擬對(duì)象結(jié)構(gòu)中的元素

class FlowerGenerator {
 private static Random rand = new Random();
 public static Flower newFlower() {
   switch (rand.nextInt(3)) {
  default:
   case 0: return new Gladiolus(); 
   case 1: return new Runuculus();
   case 2: return new Chrysanthemum();
  }
 }
}
三層交換技術(shù) 交換機(jī)與路由器密碼恢復(fù) 交換機(jī)的選購 路由器設(shè)置專題 路由故障處理手冊(cè) 數(shù)字化校園網(wǎng)解決方案



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 狠狠操精品视频 | 成人毛片免费看 | 国产午夜精品一区二区三区免费 | 欧美a一| 免费的性生活视频 | 激情小说激情图片激情电影 | 亚洲网站在线观看 | 日本一区二区高清不卡 | 亚洲成人综合网站 | av国产在线被下药迷网站 | 一级黄色大片在线观看 | 成人三级电影在线 | 9999精品 | 福利在线影院 | 丰满年轻岳中文字幕一区二区 | 日本在线观看视频网站 | 密室逃脱第一季免费观看完整在线 | 国产一区二区不卡视频 | 日本高清黄色片 | 7m视频成人精品分类 | 午夜视频福利 | 欧美日韩亚洲视频 | 国产欧美日韩视频在线观看 | h视频在线观看免费 | 黄色毛片a级 | 一级做a爱片性色毛片高清 日本一区二区在线看 | 国产一级毛片高清视频完整版 | 欧美在线观看视频网站 | 一区二区三区在线观看免费 | 91精品国产一区二区在线观看 | 999久久久| 久久福利小视频 | 久草在线资源视频 | 久久国产精品网 | 中国hdxxxx护士爽在线观看 | 91超视频 | av亚洲在线观看 | 免费播放av | 久久久国产精品网站 | 久久福利小视频 | 粉嫩粉嫩一区二区三区在线播放 |