小話設計模式(二十三)訪問者模式

2021-07-23 10:23:26 字數 2475 閱讀 8889

訪問者的適用情況:

1、 乙個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。

2、 需要對乙個物件結構中的物件進行很多不同的並且不想關的操作,而你想避免讓這些操作「汙染」這些物件的類。

3、 定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。

本文以遊戲中的倉庫為例。倉庫中含有兩種物件,乙個是道具(item)另外乙個是裝備(equipment),這兩種物件在訪問者模式中稱之為元素。我們需要使用訪問者模式,來統計倉庫中的元素的數量和總價。

物品基類:

public abstract class stuff

public int unitprice

public stuff(string name_, int unitprice_)

public abstract void accept (ivisitor visitor);

}

這裡公開了乙個accept方法用於接收訪問者。

訪問者介面定義:

public inte***ce ivisitor

分別需要實現訪問道具和訪問裝備的方法。

道具定義:

public class item : stuff

public item(string name_, int unitprice_, int num_) : base(name_, unitprice_)

public int num

public override void accept(ivisitor visitor)

}

裝備定義:

public class equipment : stuff

public override void accept(ivisitor visitor)

}

統計數量的訪問者:

public class countervisitor : ivisitor

public void visititem (item item)

public void visitequipment(equipment equipment)

}

統計總價的訪問者:

public class pricevisitor : ivisitor

public void visititem(item item)

public void visitequipment(equipment equipment)

}

接著就是倉庫:

public class inventory

public void removestuff(stuff stuff)

public void accept(ivisitor visitor) }

}

倉庫也定義了accept方法,接受visitor,並遍歷物品列表,逐個傳遞visitor。

使用:

inventory inventory = new inventory ();

inventory.addstuff (new item ("stone", 2, 10));

inventory.addstuff (new item ("log", 1, 15));

inventory.addstuff (new equipment ("lance", 200));

pricevisitor pricevisitor = new pricevisitor ();

inventory.accept (pricevisitor);

console.writeline (pricevisitor.price);

countervisitor countervisitor = new countervisitor ();

inventory.accept (countervisitor);

console.writeline (countervisitor.num);

訪問者模式的優點:

1、 易於增加新的操作。增加乙個新的訪問者即可在乙個物件結構上定義乙個新的操作。

2、 訪問者集中相關的操作而分離無關的操作。所有與操作相關的資料結構和邏輯都被隱藏在訪問者之中,而無需在元素中實現,這樣既簡化了訪問者又簡化了元素。

3、 可以訪問不具有相同父類的物件。

4、 可以累積狀態。例如本文示例當中,計算數量和總價就是累積狀態的過程。

缺點:1、 增加乙個元素類將會十分困難,因為需要為每乙個訪問者增加對應的方法。

2、 破壞封裝性,這個模式常常迫使你提供訪問元素內部狀態的公共操作,這可能會破壞它的封裝性。

所以,如果不是必要,盡量不要使用這種模式。

設計模式 訪問者模式(二十三)

軟體領域中的設計模式的重要性不言而喻。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型。雖然知道這些特性的定義但是並沒有做到真正的理解,這樣特性有什麼作用?用於什麼場合中等等問題,帶著疑問開始學習設計模式,主要參考 大話設計模式 和 設計模式 可復用物件導向軟體的基礎 兩本書。訪問者...

設計模式二十三(訪問者模式)

訪問者模式 visitor 表示乙個作用於物件結構中的各個元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作 類圖的 訪問者模式的 如下 public abstract class visitor public class concretevisitor1 extends v...

python設計模式(二十三) 訪問者模式

訪問者模式,資料結構中儲存著許多元素,當改變一種對元素的處理方式但時,我們避免重複的修改資料類的結構,那我們在設計之初就將資料的處理分離,即資料類只提供乙個資料處理的介面,而資料類的處理方法我們叫它訪問者,那麼相同結構的資料面臨不同的處理結果時,我們只需要建立不同的訪問者。我們假設一種場景 上市公司...