舉例講授設計形式中的拜訪者形式在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、 界說對象構造的類很少轉變,但常常須要在此構造上界說新的操作。轉變對象構造類須要重界說對一切拜訪者的接口,這能夠須要很年夜的價值。假如對象構造類常常轉變,那末能夠照樣在這些類中界說這些操作較好。
這些小我看來都是建議,項目中還要詳細成績詳細剖析了。