設計模式26—設計模式之訪問者模式(Visitor)(行為型)

來源:互聯網
上載者:User
1.講解訪問者模式1.1訪問者模式定義

表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。
1.2訪問者模式要點

訪問者模式把資料結構和作用於結構上的操作解耦合,使得操作集合可相對自由地演化。
訪問者模式適用於資料結構相對穩定演算法又易變化的系統。因為訪問者模式使得演算法操作增加變得容易。若系統資料結構對象易於變化,經常有新的資料對象增加進來,則不適合使用訪問者模式。
訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者。訪問者模式將有關行為集中到一個訪問者對象中,其改變不影響系統資料結構。其缺點就是增加新的資料結構很困難。
1.3訪問者模式樣本圖以及說明

 
1.Visitor 抽象訪問者角色,為該對象結構中具體元素角色聲明一個訪問操作介面。該操作介面的名字和參數標識了發送訪問請求給具體訪問者的具體元素角色,這樣訪問者就可以通過該元素角色的特定介面直接存取它。
2.ConcreteVisitor.具體訪問者角色,實現Visitor聲明的介面。
3.Element 定義一個接受訪問操作(accept()),它以一個訪問者(Visitor)作為參數。
4.ConcreteElement 具體元素,實現了抽象元素(Element)所定義的接受操作介面。
5.ObjectStructure 結構對象角色,這是使用訪問者模式必備的角色。它具備以下特性:能枚舉它的元素;可以提供一個高層介面以允許訪問者訪問它的元素;如有需要,可以設計成一個綜合物件或者一個聚集(如一個列表或無序集合)。
1.4訪問者範例程式碼

package demo24.visitor.example3;/** * 被訪問的元素的介面 */public abstract class Element {/** * 接受訪問者的訪問 * @param visitor 訪問者對象 */public abstract void accept(Visitor visitor);}************************************************************************package demo24.visitor.example3;/** * 具體元素的實現對象 */public class ConcreteElementA extends Element {public void accept(Visitor visitor) {//回調訪問者對象的相應方法visitor.visitConcreteElementA(this);}/** * 樣本方法,表示元素已有的功能實現 */public void opertionA(){//已有的功能實現}}***********************************************************************package demo24.visitor.example3;/** * 具體元素的實現對象 */public class ConcreteElementB extends Element {public void accept(Visitor visitor) {//回調訪問者對象的相應方法visitor.visitConcreteElementB(this);}/** * 樣本方法,表示元素已有的功能實現 */public void opertionB(){//已有的功能實現}}***********************************************************************package demo24.visitor.example3;/** * 訪問者介面 */public interface Visitor {/** * 訪問元素A,相當於給元素A添加訪問者的功能 * @param elementA 元素A的對象 */public void visitConcreteElementA(ConcreteElementA elementA);/** * 訪問元素B,相當於給元素B添加訪問者的功能 * @param elementB 元素B的對象 */public void visitConcreteElementB(ConcreteElementB elementB);}***********************************************************************package demo24.visitor.example3;/** * 具體的訪問者實現 */public class ConcreteVisitor1 implements Visitor {public void visitConcreteElementA(ConcreteElementA element) {//把去訪問ConcreteElementA時,需要執行的功能實現在這裡//可能需要訪問元素已有的功能,比如:element.opertionA();}public void visitConcreteElementB(ConcreteElementB element) {//把去訪問ConcreteElementB時,需要執行的功能實現在這裡//可能需要訪問元素已有的功能,比如:element.opertionB();}}***********************************************************************package demo24.visitor.example3;/** * 具體的訪問者實現 */public class ConcreteVisitor2 implements Visitor {public void visitConcreteElementA(ConcreteElementA element) {//把去訪問ConcreteElementA時,需要執行的功能實現在這裡//可能需要訪問元素已有的功能,比如:element.opertionA();}public void visitConcreteElementB(ConcreteElementB element) {//把去訪問ConcreteElementB時,需要執行的功能實現在這裡//可能需要訪問元素已有的功能,比如:element.opertionB();}}***********************************************************************package demo24.visitor.example3;import java.util.*;/** * 對象結構,通常在這裡對元素對象進行遍曆,讓訪問者能訪問到所有的元素 */public class ObjectStructure {/** * 示意,表示對象結構,可以是一個組合結構或是集合 */private Collection<Element> col = new ArrayList<Element>();/** * 示意方法,提供給用戶端操作的高層介面 * @param visitor 用戶端需要使用的訪問者 */public void handleRequest(Visitor visitor){//迴圈對象結構中的元素,接受訪問for(Element ele : col){ele.accept(visitor);}}/** * 示意方法,組建對象結構,向對象結構中添加元素。 * 不同的對象結構有不同的構建方式 * @param ele 加入到對象結構的元素 */public void addElement(Element ele){this.col.add(ele);}}***********************************************************************package demo24.visitor.example3;public class Client {public static void main(String[] args) {// 建立ObjectStructureObjectStructure os = new ObjectStructure();// 建立要加入對象結構的元素Element eleA = new ConcreteElementA();Element eleB = new ConcreteElementB();// 把元素加入對象結構os.addElement(eleA);os.addElement(eleB);// 建立訪問者Visitor visitor = new ConcreteVisitor1();// 調用業務處理的方法os.handleRequest(visitor);}}
1.5訪問者模式優缺點

優點:
好的擴充性
好的複用性
分離無關行為
缺點:
對象結構變化很困難
破壞封裝
1.6訪問者模式使用方式

1) 一個對象結構包含很多類對象,它們有不同的介面,而你想對這些對象實施一些依賴於其具體類的操作。
2) 需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而你想避免讓這些操作“汙染”這些對象的類。Visitor模式使得你可以將相關的操作集中起來 定義在一個類中。
3) 當該對象結構被很多應用共用時,用Visitor模式讓每個應用僅包含需要用到的操作。
4) 定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。改變對象結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果對象結構類經常改變,那麼可能還是在這些類中定義這些操作較好
1.7訪問者模式本質

預留通路回調實現
2.訪問者模式案例分析

這個模式,是我所遇到的比較複雜的模式,想不出一個合適的例子來,網上合適的例子很少,以後再補充。實際上範例程式碼就已經比較準確了,只是沒有一個比較合適的例子來一一對應而已。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.