定義:表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。
訪問者模式適用於資料結構相對穩定的系統, 它把資料結構和作用於資料結構之上的操作之間的耦合度降低,使得操作集合可以相對自由地改變。
資料結構的每乙個節點都可以接受乙個訪問者的呼叫,此節點向訪問者物件傳入節點物件,而訪問者物件則反過來執行節點物件的操作。這樣的過程叫做「雙重分派」。節點呼叫訪問者,將它自己傳入,訪問者則將某演算法針對此節點執行。
這裡需要明確一點:訪問者模式中具體訪問者的數目和具體節點的數目沒有任何關係。從訪問者的結構圖可以看出,訪問者模式涉及以下幾類角色。
優點:
缺點:
思路:商家定義了乙個**a,為**a新增了土豆和花生,然後張
三、李四才點了**a。
好處:不管多少人來,都是給他們的菜都是一樣的
壞處:如果**a 突然加了乙個菜 海帶, 導致所有人都要來拿海帶,所以變化是非常困難的。
using參考system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
designpatterns.visitor
}//////
抽象訪問者
/// public
abstract
class
visitor
public visitor(string
name)
public
abstract
void
visitor(potato a);
public
abstract
void
visitor(peanut b);
}//////
具體訪問者:張三
/// public
class
charger : visitor
public
override
void
visitor(potato a)
public
override
void
visitor(peanut b)
}//////
具體訪問者:李四
/// public
class
workerofpharmacy : visitor
public
override
void
visitor(potato a)
public
override
void
visitor(peanut b)
}//////
抽象元素:食物
/// public
abstract
class
food
public
food()
public
string
getname()
public
abstract
void
accept(visitor visitor);
}//////
具體元素:土豆
/// public
class
potato : food
public
override
void
accept(visitor visitor)
}//////
具體元素:花生
/// public
class
peanut : food
public
override
void
accept(visitor visitor)
}//////
具體元素:**
/// public
class
combo
}public
void
add(food med)
public
void
remove(food med)}}
歡迎閱讀本系列文章:head first設計模式之目錄
Head First設計模式之工廠模式
定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個.工廠方法讓類把例項化推遲到子類 1 抽象工廠角色 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。2 具體工廠角色 它含有和具體業務邏輯有關的 由應用程式呼叫以建立對應的具體產品的物件。3 抽象產品...
《Head First設計模式》之命令模式
命令模式就是將方法呼叫 method invocation 封裝起來。通過封裝方法呼叫,我們可以把運算塊包裝成形,所以呼叫此運算的物件不需要關心事情是如何進行的,只要知道如何使用包裝成形的方法來完成它就可以了。通過封裝方法呼叫,可以用在以下場景 記錄日誌或者重複使用這些封裝來實現撤銷 undo 我對...
Head First設計模式之組合模式
將物件組合成樹形結構來表現 整體 部分 層次結構。組合能讓客戶以一致的方法處理個別物件以及組合物件。主要部分可以被一致對待問題.組合模式主要包含三個角色 2.composite 容器構件 容器節點包含子節點,其子節點可以是葉子節點,也可以是容器節點,它提供乙個集合用於儲存子節點,實現了在抽象構件中定...