訪問者模式是物件的行為模式。封裝某些作用於某種資料結構中各元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。
抽象訪問者:抽象類或者介面,宣告訪問者可以訪問哪些元素,具體到程式中就是visit方法中的引數定義哪些物件是可以被訪問的。
訪問者:實現抽象訪問者所宣告的方法,它影響到訪問者訪問到乙個類後該幹什麼,要做什麼事情。
抽象元素類:介面或者抽象類,宣告接受哪一類訪問者訪問,程式上是通過accept方法中的引數來定義的。抽象元素一般有兩類方法,一部分是本身的業務邏輯,另外就是允許接收哪類訪問者來訪問。
元素類:實現抽象元素類所宣告的accept方法,通常都是
visitor.visit(this)
,基本上已經形成一種定式了。
結構物件:乙個元素的容器,一般包含乙個容納多個不同類、不同介面的容器,如list、
set、
map等,在專案中一般很少抽象出這個角色。
本文以雇員管理系統遇到的問題來介紹
雇員管理系統遇到的問題:
需要新增一些新的操作功能,根據剩餘年假和工資和級別計算每個員工的補貼。
傳統設計:
public class employee
public void setname(string name)
public string getname()
public void setincome(float income)
public float getincome()
public void setvacationdays(int vacationdays)
public int getvacationdays()
public void setdegree(int degree)
public int getdegree()
}
public class employees
public void attach(employee employee)
public void detach(employee employee)
public employee getemployee(string name)
public void getcompensation()
}}
public class maintest
}
訪問者模式設計方案:
抽象訪問者:
public inte***ce visitor
訪問者:
public class compensationvisitor implements visitor
}
抽象元素類:
public abstract class element
元素類:
public class employee extends element
public void setname(string name)
public string getname()
public void setincome(float income)
public float getincome()
public void setvacationdays(int vacationdays)
public int getvacationdays()
public void setdegree(int degree)
public int getdegree()
@override
public void accept(visitor visitor)
}
結構物件:
public class employees
public void attach(employee employee)
public void detach(employee employee)
public employee getemployee(string name)
public void accept(visitor visitor)
}}
測試類:
public class maintest
}
對於一組物件,在不改變資料結構的前提下,增加作用於這些結構元素新的功能。
適用於資料結構相對穩定,它把資料結構和作用於其上的操作解耦,使得操作集合可以相對自由地演化。
1、假如乙個物件中存在著一些與本物件不相干(或者關係較弱)的操作,為了避免這些操作汙染這個物件,則可以使用訪問者模式來把這些操作封裝到訪問者中去
2、假如一組物件中,存在著相似的操作,為了避免出現大量重複的**,也可以將這些重複的操作封裝到訪問者中去
主要優點有:
1、符合單一職責原則:凡是適用訪問者模式的場景中,元素類中需要封裝在訪問者中的操作必定是與元素類本身關係不大且是易變的操作,一方面符合單一職責原則。
2、擴充套件性良好:元素類可以通過接受不同的訪問者來實現對不同操作的擴充套件。
缺點主要有:
每增加乙個元素類都需要修改訪問者類(也包括訪問者類的子類或者實現類),修改起來相當麻煩。也就是說,在元素類數目不確定的情況下,應該慎用訪問者模式。所以,訪問者模式比較適用於對已有功能的重構,比如說,元素類的資料已經基本確定下來不會變了,會變的只是這些元素內的相關操作,這時候,我們可以使用訪問者模式對原有的**進行重構一遍,這樣一來,就可以在不修改各個元素類的情況下,對原有功能進行修改。
設計模式 訪問者模式(二十三)
軟體領域中的設計模式的重要性不言而喻。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型。雖然知道這些特性的定義但是並沒有做到真正的理解,這樣特性有什麼作用?用於什麼場合中等等問題,帶著疑問開始學習設計模式,主要參考 大話設計模式 和 設計模式 可復用物件導向軟體的基礎 兩本書。訪問者...
設計模式二十三(訪問者模式)
訪問者模式 visitor 表示乙個作用於物件結構中的各個元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作 類圖的 訪問者模式的 如下 public abstract class visitor public class concretevisitor1 extends v...
python設計模式(二十三) 訪問者模式
訪問者模式,資料結構中儲存著許多元素,當改變一種對元素的處理方式但時,我們避免重複的修改資料類的結構,那我們在設計之初就將資料的處理分離,即資料類只提供乙個資料處理的介面,而資料類的處理方法我們叫它訪問者,那麼相同結構的資料面臨不同的處理結果時,我們只需要建立不同的訪問者。我們假設一種場景 上市公司...