設計模式之訪問者模式

2021-07-03 12:46:08 字數 2266 閱讀 6996

定義:表示乙個作用於某物件結構中的各元素的操作,它使得使用者可以再不改變各元素的累的前提下定義作用於這些元素的新操作,它是一種物件行為模式。

類圖:

說明:抽象訪問者visitor是乙個抽象訪問者,宣告訪問者可以訪問哪些元素;具體訪問者concretevisitor就是指訪問者訪問到乙個類後要做什麼事情;抽象元素element是乙個抽象類,生命接受哪一型別的訪問者訪問;具體元素concreteelement會實現accept方法;而結構物件objectstructure是乙個容納多個不同類、不同介面的容器(如列表或者無序集合),是使用訪問者模式必備的角色。

據《大話設計模式》中說是最複雜也是最難以理解的一種模式。在這裡有一句話提出來幫助讀者去理解,那就是「一千個讀者有一千個哈姆雷特」,這句話有兩層含義;

①書是乙個抽象元素,《哈姆雷特》作為乙個具體元素可以接受訪問者的「訪問」;②讀者們「訪問」完《哈姆雷特》之後會有自己的見解,這就相當於讀者們各自執行了自己的方法一樣。

優點

:1.增加新的訪問操作很方便。

2.符合單一職責原則:將有關元素物件的訪問行為集中到乙個訪問者物件中,而不是分散在乙個個的元素類中,使累的職責更加清晰。

3.讓使用者能夠在不修改現有元素類層次結構的情況下,定義作用於該層次結構的操作。

缺點:

1.增加新的元素類很困難

2.破壞封裝

例項場景:購物車,顧客在超市izhong將選擇的商品,如蘋果,圖書等放在購物車中,然後到收銀員處付款。在購物車過程中,顧客需要對這些商品進行訪問,以便確認這些商品的質量,之後收銀員計算**時也需要訪問購物車內顧客所選擇的商品,此時,購物車作為乙個objectstructure(物件結構),

用於儲存各種型別的商品,而顧客和收銀員作為訪問這些商品的訪問者,他們需要對商品進行檢查和計價。不同型別的商品器訪問形式也可能不同,如蘋果需要過秤之後在計價,而圖書不需要。使用訪問者模式來設計該購物過程。

例項類圖:

例項**:

//訪問者類

public abstract class visitor 

public void setname(string newname)

public abstract void visit(book book);

}

public class customer extends visitor 

public void visit(book book)

}

public class saler extends visitor 

public void visit(book book)

}

//被訪問這類

public inte***ce product
private string name = "蘋果";

public string getname()

public void accept(visitor v)

public void operatora()

}

public class book implements product 

public void accept(visitor v)

public void operatorb()

}

//購物車類

public class shoppingcart 

} public void addproduct(product product)

public void removeproduct(product product)

}

//測試客戶端:

public class client 

}

例項**執行結果:

設計模式之訪問者模式

先看一下下面這段 class person public string getaction public void setaction string action public void getconclusion else if action exciting else if action gri...

設計模式之訪問者模式

我們去銀行櫃檯辦業務,一般情況下會開幾個個人業務櫃檯的,你去其中任何乙個櫃檯辦理都是可以的。我們的訪問者模式可以很好付諸在這個場景中 對於銀行櫃檯來說,他們是不用變化的,就是說今天和明天提供個人業務的櫃檯是不需要有變化的。而我們作為訪問者,今天來銀行可能是取消費流水,明天來銀行可能是去辦理手機銀行業...

設計模式之訪問者模式

定義 表示一介作用於某個物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。結構圖 示例 public inte ce vistor public class concretevisitor1 implements vistor override public ...