今天要認識的Design Pattern我覺得比較難,但我會盡量以簡單的方法讓大家了解 Visitor Pattern是如何運作的,現在就來學習一下吧!
想像一下有位經驗豐富的保險經紀人,為了擁有更多的客戶,他必須對於不同的對象去設計不同的保單,比方說對於一般民眾,可能會賣的是醫療相關的保單;而面對公司戶的話,可能是針對竊盜險、天然災害等等類型的保單,由此對症下藥,提高成交的機率。
以上述例子來看,保險經紀人就相當於訪問者模式中的 Visitor,他擁有不同的做法(不同類型的保單)去對應不一樣的客戶(也就是實體物件),而要實現的做法端看於是哪一個客戶而定。
也就是說,當套用到訪問者模式的時候,客戶端不會調用需要的方法,而是讓物件本身(也就是客戶)作為參數並傳遞給訪問者物件(保險經紀人),這時就會發揮物件導向的特性,多型(在第三天有介紹到),訪問者會依據傳遞過來的物件去執行該物件所需的訪問方法。
雖然這樣的結構若是要添加其它行為,還是得修改物件的程式,但至少修改的程式不至於影響程式的運作,只需要實現一個新的訪問者類別就可以了。
interface Element {
public Type accept(Visitor v);
}
class ElementA implements Element {
public Type featureA() {...}
public Type accept(Visitor v) {
return v.visit(this);
}
}
class ElementB implements Element {
public Type featureB() {...}
public Type accept(Visitor v) {
return v.visit(this);
}
}
interface Visitor {
public String visit(ElementA element);
public String visit(ElementB element);
}
class ConcreteVisitor implements Visitor {
public Type visit(ElementA e) {
// The algorithm of the ElementA
e.featureA();
}
public Type visit(ElementB e) {
// The algorithm of the ElementB
e.featureB();
}
}
訪問者模式就是將物件與其操作行為分開,因此,當操作的邏輯發生變化的時候,我們只需要在訪問者方法的程式進行修改,而不是在實體物件中修改,如果要添加新的方法的話也很容易,只要修改一下訪問者的介面與其實現的類別就好,原有的物件也不會受到影響。
除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章
juck30808 - Python - 數位行銷分析與 Youtube API 教學
SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?