<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                25.2 訪問者模式的定義 訪問者模式(Visitor Pattern)是一個相對簡單的模式,其定義如下:Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. (封裝一些作用于某種數據結構中的各元素的操作,它可以在不改變數據結構的前提下定義作用于這些元素的新的操作。) 訪問者模式的通用類圖如圖25-5所示。 ![](https://box.kancloud.cn/2016-08-14_57b0036a65df1.jpg) 圖25-5 訪問者模式的通用類圖 看了這個通用類圖,大家可能要犯迷糊了,這里怎么有一個ObjectStruture類呢?你剛剛舉的例子怎么就沒有呢?真沒有嗎?我們不是定義了一個List了嗎?它中間的元素是我們一個一個手動增加上去的,這就是一個ObjectStruture,我們來看這幾個角色的職責。 ● Visitor——抽象訪問者 抽象類或者接口,聲明訪問者可以訪問哪些元素,具體到程序中就是visit方法的參數定義哪些對象是可以被訪問的。 ● ConcreteVisitor——具體訪問者 它影響訪問者訪問到一個類后該怎么干,要做什么事情。 ● Element——抽象元素 接口或者抽象類,聲明接受哪一類訪問者訪問,程序上是通過accept方法中的參數來定義的。 ● ConcreteElement——具體元素 實現accept方法,通常是visitor.visit(this),基本上都形成了一種模式了。 ● ObjectStruture——結構對象 元素產生者,一般容納在多個不同類、不同接口的容器,如List、Set、Map等,在項目中,一般很少抽象出這個角色。 大家可以這樣理解訪問者模式,我作為一個訪客(Visitor)到朋友家(Visited Class)去拜訪,朋友之間聊聊天,喝喝酒,再相互吹捧吹捧,炫耀炫耀,這都正常。聊天的時候,朋友告訴我,他今年加官晉爵了,工資也漲了30%,準備再買套房子,那我就在心里盤算(Visitor-self-method)“你這么有錢,我去年要借10萬你都不借”,我根據朋友的信息,執行了自己的一個方法。 我們來看看訪問者模式的通用源碼,先看抽象元素,如代碼清單25-11所示。 代碼清單25-11 抽象元素 public?abstract?class?Element?{ ?????//定義業務邏輯 ?????public?abstract?void?doSomething(); ?????//允許誰來訪問 ?????public?abstract?void?accept(IVisitor?visitor); } 抽象元素有兩類方法:一是本身的業務邏輯,也就是元素作為一個業務處理單元必須完成的職責;另外一個是允許哪一個訪問者來訪問。我們來看具體元素,如代碼清單25-12所示。 代碼清單25-12 具體元素 public?class?ConcreteElement1?extends?Element{ ?????//完善業務邏輯 ?????public?void?doSomething(){ ?????????????//業務處理 ?????} ?????//允許那個訪問者訪問 ?????public?void?accept(IVisitor?visitor){ ?????????????visitor.visit(this); ?????} } public?class?ConcreteElement2?extends?Element{ ?????//完善業務邏輯 ?????public?void?doSomething(){ ?????????????//業務處理 ?????} ?????//允許那個訪問者訪問 ?????public?void?accept(IVisitor?visitor){ ?????????????visitor.visit(this); ?????} } 它定義了兩個具體元素,我們再來看抽象訪問者,一般是有幾個具體元素就有幾個訪問方法,如代碼清單25-13所示。 代碼清單25-13 抽象訪問者 public?interface?IVisitor?{ ?????//可以訪問哪些對象 ?????public?void?visit(ConcreteElement1?el1); ?????public?void?visit(ConcreteElement2?el2); } 具體訪問者如代碼清單25-14所示。 代碼清單25-14 具體訪問者 public?class?Visitor?implements?IVisitor?{ ?????//訪問el1元素 ?????public?void?visit(ConcreteElement1?el1)?{ ?????????????el1.doSomething(); ?????} ?????//訪問el2元素 ?????public?void?visit(ConcreteElement2?el2)?{ ?????????????el2.doSomething(); ?????} } 結構對象是產生出不同的元素對象,我們使用工廠方法模式來模擬,如代碼清單25-15所示。 代碼清單25-15 結構對象 public?class?ObjectStruture?{ ?????//對象生成器,這里通過一個工廠方法模式模擬 ?????public?static?Element?createElement(){ ?????????????Random?rand?=?new?Random(); ?????????????if(rand.nextInt(100)?>?50){ ?????????????????????return?new?ConcreteElement1(); ?????????????}else{ ?????????????????????return?new?ConcreteElement2(); ?????????????} ?????} } 進入了訪問者角色后,我們對所有的具體元素的訪問就非常簡單了,我們通過一個場景類模擬這種情況,如代碼清單25-16所示。 代碼清單25-16 場景類 public?class?Client?{ ?????public?static?void?main(String[]?args)?{ ?????????????for(int?i=0;i<10;i++){ ?????????????????????//獲得元素對象 ?????????????????????Element?el?=?ObjectStruture.createElement(); ?????????????????????//接受訪問者訪問 ?????????????????????el.accept(new?Visitor()); ?????????????}?????????? ?????} } 通過增加訪問者,只要是具體元素就非常容易訪問,對元素的遍歷就更加容易了,甭管它是什么對象,只要它在一個容器中,都可以通過訪問者來訪問,任務集中化。這就是訪問者模式。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看