表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。
1.visitor 抽象訪問者角色,為該物件結構中具體元素角色宣告乙個訪問操作介面。該操作介面的名字和引數標識了傳送訪問請求給具體訪問者的具體元素角色,這樣訪問者就可以通過該元素角色的特定介面直接訪問它。
2.concretevisitor.具體訪問者角色,實現visitor宣告的介面。
3.element 定義乙個接受訪問操作(accept()),它以乙個訪問者(visitor)作為引數。
4.concreteelement 具體元素,實現了抽象元素(element)所定義的接受操作介面。
5.objectstructure 結構物件角色,這是使用訪問者模式必備的角色。它具備以下特性:能列舉它的元素;可以提供乙個高層介面以允許訪問者訪問它的元素;如有需要,可以設計成乙個復合物件或者乙個聚集(如乙個列表或無序集合)。
在生活中,我們要去醫院看病,當我們**找到主治醫生的醫生看完病以後,會給你開一張藥單,這個時候你需要先去付費,由劃價醫生收取藥費,然後你拿著付費單再去找抓藥師抓藥。傳統上我們也許會,寫乙個劃價師類,裡面根據藥的名稱做判斷收取多少費用;寫乙個抓藥師根據藥單上面名稱要判斷去**抓藥。可能使用switch進行判斷,這樣增加了藥就要改變劃價人員和藥房工作者的**。
訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作,一旦這些操作需要修改的話,接受這個操作的資料結構可以保持不變。為不同型別的元素提供多種訪問操作方式,且可以在不修改原有系統的情況下增加新的操作方式,這就是訪問者模式的模式動機。
/// /// 抽象訪問者
///
public abstract class visitor
public visitor(string name)
public abstract void visitor(medicinea a);
public abstract void visitor(medicineb b);
}
/// /// 具體訪問者:劃價員
///
public class charger :visitor
public override void visitor(medicinea a)
public override void visitor(medicineb b)
}
/// /// 具體訪問者:藥房工作者
///
public class workerofpharmacy:visitor
public override void visitor(medicinea a)
public override void visitor(medicineb b)
}
/// /// 抽象元素:藥
///
public abstract class medicine
protected double price
public medicine(string name, double price)
public string getname()
public double getprice()
public void setprice(double price)
public abstract void accept(visitor visitor);
}
/// /// 具體元素:a名稱藥
///
public class medicinea:medicine
public override void accept(visitor visitor)
}
/// /// 具體元素:b名稱藥
///
public class medicineb:medicine
public override void accept(visitor visitor)
}
/// /// 具體元素:藥單
///
public class presciption
}public void add(medicine med)
public void remove(medicine med)
}
/// /// c#設計模式-訪問者模式
優點:1、使得新增新的訪問操作變得更加簡單。
2、能夠使得使用者在不修改現有類的層次結構下,定義該類層次結構的操作。
3、將有關元素物件的訪問行為集中到乙個訪問者物件中,而不是分散搞乙個個的元素類中。
缺點:1、增加新的元素類很困難。在訪問者模式中,每增加乙個新的元素類都意味著要在抽象訪問者角色中增加乙個新的抽象操作,並在每乙個具體訪問者類中增加相應的具體操作,違背了「開閉原則」的要求。
2、破壞封裝。當採用訪問者模式的時候,就會打破組合類的封裝。
3、比較難理解
1、物件結構中物件對應的類很少改變,但經常需要在此物件結構上定義新的操作。
2、需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而需要避免讓這些操作「汙染」這些物件的類,也不希望在增加新操作時修改這些類。
C 設計模式 訪問者模式
1 訪問者模式定義 表示乙個作用於其物件結構中的各個元素的操作。訪問者模式是一種物件行為型模式,它為操作儲存不同的型別元素的物件結構提供了一種解決方案,使用者可以對不同型別的元素施加不同的操作。訪問者模式常常和組合模式一起使用。2 訪問者模式結構 該模式包含五種角色 1 抽象訪問者類 visitor...
C 設計模式 訪問者模式
一.介紹 訪問者模式 visitor pattern 屬於行為型模式。表示乙個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。二.實現 舉個例子,如果有元素a b類,想呼叫這些元素中的print方法,很簡單地,只要例項化去呼叫就可以。public a...
C 設計模式 訪問者模式
動機 在軟體構建的過程中,由於需求的改變,某些類層次結構中常常需要增加新的行為 方法 如果直接在基類中做這樣的更改,將會給子類帶來很繁重的變更負擔,甚至破壞原有設計。如何在不更改類層次結構的前提下,在執行時根據需要透明地為類層次結構上的各個類動態新增新的操作,從而避免上述問題?模式定義 表示乙個作用...